#Activate necessary libraries

library(ConvergenceClubs)
package 㤼㸱ConvergenceClubs㤼㸲 was built under R version 4.0.4
library(tidyverse)
Registered S3 methods overwritten by 'dbplyr':
  method         from
  print.tbl_lazy     
  print.tbl_sql      
-- Attaching packages --------------------------------------- tidyverse 1.3.0 --
v ggplot2 3.3.5     v purrr   0.3.4
v tibble  3.1.2     v dplyr   1.0.7
v tidyr   1.1.0     v stringr 1.4.0
v readr   1.3.1     v forcats 0.5.0
package 㤼㸱ggplot2㤼㸲 was built under R version 4.0.5package 㤼㸱tibble㤼㸲 was built under R version 4.0.5package 㤼㸱tidyr㤼㸲 was built under R version 4.0.2package 㤼㸱dplyr㤼㸲 was built under R version 4.0.5-- Conflicts ------------------------------------------ tidyverse_conflicts() --
x dplyr::filter() masks stats::filter()
x dplyr::lag()    masks stats::lag()
library(janitor)

Attaching package: 㤼㸱janitor㤼㸲

The following objects are masked from 㤼㸱package:stats㤼㸲:

    chisq.test, fisher.test
library(tibble)
library(data.table)
package 㤼㸱data.table㤼㸲 was built under R version 4.0.4Registered S3 method overwritten by 'data.table':
  method           from
  print.data.table     
data.table 1.14.0 using 4 threads (see ?getDTthreads).  Latest news: r-datatable.com

Attaching package: 㤼㸱data.table㤼㸲

The following objects are masked from 㤼㸱package:dplyr㤼㸲:

    between, first, last

The following object is masked from 㤼㸱package:purrr㤼㸲:

    transpose
library(ExPanDaR)
Registered S3 methods overwritten by 'htmltools':
  method               from         
  print.html           tools:rstudio
  print.shiny.tag      tools:rstudio
  print.shiny.tag.list tools:rstudio
Registered S3 method overwritten by 'htmlwidgets':
  method           from         
  print.htmlwidget tools:rstudio

#Part I: Nominal Wage using definition “A” of worker #Load the data

library(readxl)
nominal.wage <- read_excel("WS Labour_new.xlsx", 
    sheet = "nominal_wage_A")
nominal.wage

#Select data only from 2008 onwards and remove “Region” column, and remove the observation of Indonesia

nominal.wage <- nominal.wage %>% 
  select(-c(1,3:5)) %>% 
  subset(Province!="National")

#transform the wage series to log

nominal.wage.log <- log(nominal.wage[,-1])
nominal.wage.log

#Remove short-run noise using HP filter

f.nominal.wage.log <- apply(nominal.wage.log, 1, 
function(x){mFilter::hpfilter(x, freq=6.25, type="lambda")$trend} ) 
f.nominal.wage.log <- data.frame(Province = nominal.wage[,1], t(f.nominal.wage.log), stringsAsFactors=FALSE ) 
colnames(f.nominal.wage.log) <- colnames(nominal.wage) 

#Inspect the filtered data

head(f.nominal.wage.log)

#Run the log-t-test

H.nominal <- computeH(f.nominal.wage.log[,-1], quantity = "H")
round(estimateMod(H.nominal, time_trim=0.333, HACmethod = "FQSB"), 3)
    beta  std.err   tvalue   pvalue 
  -1.132    0.011 -100.550    0.000 

#find convergence clubs

clubs.nominal <- findClubs(f.nominal.wage.log, dataCols=2:14, unit_names = 1, refCol=14,
time_trim=0.333, cstar=0, HACmethod = 'FQSB')
summary(clubs.nominal)
Number of convergence clubs: 2
Number of divergent units: 0

        | # of units  | beta     | std.err  | tvalue   | cstar  
-------- ------------- ---------- ---------- ---------- --------
 club1  |   12        |  -0.378  |   0.087  |  -4.316  |   0    
 club2  |   22        |  -0.058  |   0.104  |  -0.558  |   0    
print(clubs.nominal)
================================================= 
club 1
------------------------------------------------- 
Banten, Papua, East Kalimantan, Riau Islands, 
North Kalimantan, Jakarta, West Java, North 
Sulawesi, Central Kalimantan, West Papua, Bali, 
South Sulawesi

beta:     -0.3775 
std.err:   0.0875 
tvalue:   -4.3161 
pvalue:    0 
cstar:     0 

================================================= 
club 2
------------------------------------------------- 
South Kalimantan, Bangka Belitung, North Maluku, 
Maluku, West Sumatera, Riau, Southeast Sulawesi, 
Bengkulu, Aceh, West Kalimantan, Central 
Sulawesi, Gorontalo, North Sumatera, West Nusa 
Tenggara, East Java, Jambi, Lampung, Yogyakarta, 
Central Java, East Nusa Tenggara, South 
Sumatera, West Sulawesi

beta:     -0.0579 
std.err:   0.1037 
tvalue:   -0.5585 
pvalue:    0.2883 
cstar:     0 
plot(clubs.nominal)

plot(clubs.nominal, clubs=NULL, avgTP = TRUE, legend=TRUE)

#Merge clubs

mclubs.nominal <- mergeClubs(clubs.nominal, mergeMethod='PS')
summary(mclubs.nominal)
Number of convergence clubs: 2
Number of divergent units: 0

        | merged clubs  | # of units  | beta     | std.err  | tvalue   
-------- --------------- ------------- ---------- ---------- ----------
 club1  | clubs: 1      |   12        |  -0.378  |   0.087  |  -4.316  
 club2  | clubs: 2      |   22        |  -0.058  |   0.104  |  -0.558  
mclubs.nominal
================================================= 
club 1
------------------------------------------------- 
Banten, Papua, East Kalimantan, Riau Islands, 
North Kalimantan, Jakarta, West Java, North 
Sulawesi, Central Kalimantan, West Papua, Bali, 
South Sulawesi

beta:     -0.3775 
std.err:   0.0875 
tvalue:   -4.3161 
pvalue:    0 

================================================= 
club 2
------------------------------------------------- 
South Kalimantan, Bangka Belitung, North Maluku, 
Maluku, West Sumatera, Riau, Southeast Sulawesi, 
Bengkulu, Aceh, West Kalimantan, Central 
Sulawesi, Gorontalo, North Sumatera, West Nusa 
Tenggara, East Java, Jambi, Lampung, Yogyakarta, 
Central Java, East Nusa Tenggara, South 
Sumatera, West Sulawesi

beta:     -0.0579 
std.err:   0.1037 
tvalue:   -0.5585 
pvalue:    0.2883 
plot(mclubs.nominal)

plot(mclubs.nominal, clubs=NULL, avgTP = TRUE, legend=TRUE)


#Part II: Real Wage using definition “A” of worker #Load the data

library(readxl)
real.wage <- read_excel("WS Labour_new.xlsx", 
    sheet = "real_wage_A")
real.wage

#Select data only from 2008 onwards and remove “Region” column, and remove the observation of Indonesia

real.wage <- real.wage %>% 
  select(-c(1,3:5)) %>% 
  subset(Province!="National")

#transform the wage series to log

real.wage.log <- log(real.wage[,-1])
real.wage.log

#Remove short-run noise using HP filter

f.real.wage.log <- apply(real.wage.log, 1, 
function(x){mFilter::hpfilter(x, freq=6.25, type="lambda")$trend} ) 
f.real.wage.log <- data.frame(Province = real.wage[,1], t(f.real.wage.log), stringsAsFactors=FALSE ) 
colnames(f.real.wage.log) <- colnames(real.wage) 

#Inspect the filtered data

head(f.real.wage.log)

#Run the log-t-test

H.real <- computeH(f.real.wage.log[,-1], quantity = "H")
round(estimateMod(H.real, time_trim=0.333, HACmethod = "FQSB"), 3)
   beta std.err  tvalue  pvalue 
 -1.130   0.014 -79.721   0.000 

#find convergence clubs

clubs.real <- findClubs(f.real.wage.log, dataCols=2:14, unit_names = 1, refCol=14,
time_trim=0.333, cstar=0, HACmethod = 'FQSB')
summary(clubs.real)
Number of convergence clubs: 3
Number of divergent units: 0

        | # of units  | beta     | std.err  | tvalue   | cstar  
-------- ------------- ---------- ---------- ---------- --------
 club1  |   3         |   0.113  |   0.232  |   0.486  |   0    
 club2  |   9         |   0.745  |   0.242  |   3.081  |   0    
 club3  |   22        |  -0.014  |   0.108  |  -0.126  |   0    
print(clubs.real)
================================================= 
club 1
------------------------------------------------- 
Jakarta, Riau Islands, Banten

beta:      0.1128 
std.err:   0.232 
tvalue:    0.4863 
pvalue:    0.6866 
cstar:     0 

================================================= 
club 2
------------------------------------------------- 
Papua, East Kalimantan, North Kalimantan, West 
Java, West Papua, North Sulawesi, Bali, Central 
Kalimantan, South Sulawesi

beta:      0.7446 
std.err:   0.2417 
tvalue:    3.0808 
pvalue:    0.999 
cstar:     0 

================================================= 
club 3
------------------------------------------------- 
North Maluku, Riau, Maluku, West Sulawesi, South 
Kalimantan, Bangka Belitung, Southeast Sulawesi, 
West Sumatra, Aceh, Gorontalo, East Java, North 
Sumatra, Bengkulu, Yogyakarta, Central Java, 
South Sumatra, West Nusa Tenggara, Jambi, 
Lampung, Central Sulawesi, West Kalimantan, East 
Nusa Tenggara

beta:     -0.0136 
std.err:   0.1079 
tvalue:   -0.1261 
pvalue:    0.4498 
cstar:     0 
plot(clubs.real)

plot(clubs.real, clubs=NULL, avgTP = TRUE, legend=TRUE)

#Merge clubs

mclubs.real <- mergeClubs(clubs.real, mergeMethod='PS')
summary(mclubs.real)
Number of convergence clubs: 3
Number of divergent units: 0

        | merged clubs  | # of units  | beta     | std.err  | tvalue   
-------- --------------- ------------- ---------- ---------- ----------
 club1  | clubs: 1      |   3         |   0.113  |   0.232  |   0.486  
 club2  | clubs: 2      |   9         |   0.745  |   0.242  |   3.081  
 club3  | clubs: 3      |   22        |  -0.014  |   0.108  |  -0.126  
mclubs.real
================================================= 
club 1
------------------------------------------------- 
Jakarta, Riau Islands, Banten

beta:      0.1128 
std.err:   0.232 
tvalue:    0.4863 
pvalue:    0.6866 

================================================= 
club 2
------------------------------------------------- 
Papua, East Kalimantan, North Kalimantan, West 
Java, West Papua, North Sulawesi, Bali, Central 
Kalimantan, South Sulawesi

beta:      0.7446 
std.err:   0.2417 
tvalue:    3.0808 
pvalue:    0.999 

================================================= 
club 3
------------------------------------------------- 
North Maluku, Riau, Maluku, West Sulawesi, South 
Kalimantan, Bangka Belitung, Southeast Sulawesi, 
West Sumatra, Aceh, Gorontalo, East Java, North 
Sumatra, Bengkulu, Yogyakarta, Central Java, 
South Sumatra, West Nusa Tenggara, Jambi, 
Lampung, Central Sulawesi, West Kalimantan, East 
Nusa Tenggara

beta:     -0.0136 
std.err:   0.1079 
tvalue:   -0.1261 
pvalue:    0.4498 
plot(mclubs.real)

plot(mclubs.real, clubs=NULL, avgTP = TRUE, legend=TRUE)

class(mclubs.nominal)
[1] "convergence.clubs" "list"             
table.mclubs.nom <- map(mclubs.nominal, as.data.table)
Item 3 has 4 rows but longest item has 22; recycled with remainder.
df.mclubs.nom <- rbindlist(table.mclubs.nom, fill = T, idcol = T)
df.mclubs.nom
colnames(df.mclubs.nom)[5] <- "Province"
df.mclubs.nom
nominal.wage.club <- as.data.frame(
  inner_join(f.nominal.wage.log, df.mclubs.nom, by="Province") %>% 
  select(-contains(c("id","model")))
  ) 
nominal.wage.club

#Generate relative value for all clubs

relative <- list()
for(a in 2:14) {
  relative[[a]] <- data.frame(nominal.wage.club$Province, nominal.wage.club[,a]/mean(nominal.wage.club[,a]))
colnames(relative[[a]])[1]<- "Province"
colnames(relative[[a]])[2]<- 
paste("rel",colnames(nominal.wage.club)[a],sep="_")
}

for (x in 2:13) {
  relative[[x+1]]<-left_join(relative[[x]],relative[[x+1]], by="Province")
}
table.relative <- map(relative, as.data.table)
df.relative <- rbindlist(table.relative, fill = T, idcol = T) %>% drop_na()
library(plyr)
package 㤼㸱plyr㤼㸲 was built under R version 4.0.4----------------------------------------------------
You have loaded plyr after dplyr - this is likely to cause problems.
If you need functions from both plyr and dplyr, please load plyr first, then dplyr:
library(plyr); library(dplyr)
----------------------------------------------------

Attaching package: 㤼㸱plyr㤼㸲

The following objects are masked from 㤼㸱package:dplyr㤼㸲:

    arrange, count, desc, failwith, id, mutate,
    rename, summarise, summarize

The following object is masked from 㤼㸱package:purrr㤼㸲:

    compact
df.relative <- join(df.relative,nominal.wage.club,by=c('Province')) %>% 
  select(Province,contains("rel"),clubs)
  
df.relative <- as.data.frame(df.relative)
colnames(df.relative) <- gsub("rel_","",colnames(df.relative))
df.relative
df.relative.long <- df.relative %>%  pivot_longer(-c(Province,clubs), names_to = "Time", values_to="Rel_Wage")
df.relative.long
df.relative.path <- aggregate(Rel_Wage ~ clubs + Time, df.relative.long, mean) %>% 
  arrange(clubs)
path_all <- df.relative.path %>% 
  ggplot(aes(x=Time,y=Rel_Wage, group=clubs, col=clubs)) + geom_line() +
  labs(title = "Transition path of all clubs") +
  theme_bw()
path_all
ggsave("path_all.png", width = 9, height = 5)

#Generate relative value for within club #Create dataframe for each club

club1 <- nominal.wage.club %>% 
  filter(clubs == "club1")
relative.club1 <- list()
for(a in 2:14) {
  relative.club1[[a]] <- data.frame(club1$Province, club1[,a]/mean(club1[,a]))
colnames(relative.club1[[a]])[1]<- "Province"
colnames(relative.club1[[a]])[2]<- 
paste("rel",colnames(club1)[a],sep="_")
}

for (x in 2:13) {
  relative.club1[[x+1]]<-left_join(relative.club1[[x]],relative.club1[[x+1]], by="Province")
}
table.relative.club1 <- map(relative.club1, as.data.table)
df.relative.club1 <- rbindlist(table.relative.club1, fill = T, idcol = T) %>% drop_na()
library(plyr)
df.relative.club1 <- join(df.relative.club1,club1,by=c('Province')) %>% 
  select(Province,contains("rel"),clubs)
  
df.relative.club1
colnames(df.relative.club1) <- gsub("rel_","",colnames(df.relative.club1))
df.relative.club1
df.relative.club1.long <- df.relative.club1 %>%  pivot_longer(-c(Province,clubs), names_to = "Time", values_to="Rel_Wage")
df.relative.club1.long
df.relative.club1.path <- aggregate(Rel_Wage ~ Province + Time, df.relative.club1.long, mean) %>% 
  arrange(Province)
path_club1 <- df.relative.club1.path %>% 
  ggplot(aes(x=Time,y=Rel_Wage, group=Province, col=Province)) + geom_line() +
  labs(title = "Transition path of regions in Club 1") +
  theme_bw() +
   theme(legend.title = element_text(size = 8), 
               legend.text = element_text(size = 8))
path_club1
ggsave("path_club1.png", width = 9, height = 5)

club2 <- nominal.wage.club %>% 
  filter(clubs == "club2")
relative.club2 <- list()
for(a in 2:14) {
  relative.club2[[a]] <- data.frame(club2$Province, club2[,a]/mean(club2[,a]))
colnames(relative.club2[[a]])[1]<- "Province"
colnames(relative.club2[[a]])[2]<- 
paste("rel",colnames(club2)[a],sep="_")
}

for (x in 2:13) {
  relative.club2[[x+1]]<-left_join(relative.club2[[x]],relative.club2[[x+1]], by="Province")
}
table.relative.club2 <- map(relative.club2, as.data.table)
df.relative.club2 <- rbindlist(table.relative.club2, fill = T, idcol = T) %>% drop_na()
library(plyr)
df.relative.club2 <- join(df.relative.club2,club2,by=c('Province')) %>% 
  select(Province,contains("rel"),clubs)
  
df.relative.club2
colnames(df.relative.club2) <- gsub("rel_","",colnames(df.relative.club2))
df.relative.club2
df.relative.club2.long <- df.relative.club2 %>%  pivot_longer(-c(Province,clubs), names_to = "Time", values_to="Rel_Wage")
df.relative.club2.long
df.relative.club2.path <- aggregate(Rel_Wage ~ Province + Time, df.relative.club2.long, mean) %>% 
  arrange(Province)
path_club2 <- df.relative.club2.path %>% 
  ggplot(aes(x=Time,y=Rel_Wage, group=Province, col=Province)) + geom_line() +
  labs(title = "Transition path of regions in Club 2") +
  theme_bw() +
  theme(legend.title = element_text(size = 7), 
               legend.text = element_text(size = 7))
path_club2
ggsave("path_club2.png", width = 9, height = 5)

#Part II: Real Wage using definition “A” of worker #Load the data

library(readxl)
real.wage <- read_excel("WS Labour_new.xlsx", 
    sheet = "real_wage_A")
real.wage

#Regional wage faceted by region

df <- real.wage %>% 
  select(-c(3:5)) %>% 
  subset(Province!="National")
df

#Transform to long format for ploting

df.long <- df %>% 
  pivot_longer(!c(Region, Province), names_to="Year", values_to="Wage")
df.long$Year <- as.factor(df.long$Year)
df.long$Region_f = factor(df.long$Region, levels=c('Sumatra','Java','Bali-Nustra','Kalimantan', 'Sulawesi', 'Maluku-Papua'))
ggplot(df.long, aes(Year, Wage, group=Province)) + geom_line(size=0.3) +
  facet_wrap(~Region_f) +
  theme(
    axis.text.x=element_text(angle=90,hjust=0.5, size=7),
    axis.text.y=element_text(size=7),
    panel.background = element_blank(),
    axis.title=element_text(size=8),
    strip.text = element_text(size=8)
    ) +
  labs(y="Monthly real wage (000 IDR)", size=3)
ggsave("wage.plot.png")
Saving 4.71 x 2.91 in image

#Select data only from 2008 onwards and remove “Region” column, and remove the observation of Indonesia

real.wage <- real.wage %>% 
  select(-c(1,3:5)) %>% 
  subset(Province!="National")

#Transform to long format for ploting

real.wage.long <- real.wage %>% 
  pivot_longer(!Province, names_to="Year", values_to="Wage")
real.wage.long <- as.data.frame(real.wage.long)
real.wage.long$Year <- as.Date(as.factor(real.wage.long$Year), format = "%Y")
real.wage.long$Year <- as.factor(as.numeric(real.wage.long$Year))
prepare_trend_graph(real.wage.long, "Year", c("Wage"))$plot

prepare_quantile_trend_graph(real.wage.long, "Year", c(0.05, 0.25, 0.5, 0.75, 0.95), "Wage")$plot +
  ggplot2::ylab("Real wage (000 IDR)") + scale_x_continuous(breaks = 2008:2020) +
  theme_classic() + guides(color=guide_legend("Quantile")) + theme(axis.text.x=element_text(angle=90, size=10))

#ggsave("wage_quantile.png", width = 9, height = 5)
graph <- prepare_quantile_trend_graph(real.wage.long[c("Year", "Wage")], "Year", c(0.05, 0.25, 0.5, 0.75, 0.95))
graph$plot

#Plot wage of all provinces

graph <- real.wage.long %>%
ggplot(aes(x = Year, y = Wage, group=Province)) +
geom_line(size=0.5, color = "dark gray") +
labs(x = "Time",
y = "Average real wage per month (thousand IDR)", color="") +
theme(text=element_text( family="Palatino")) + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
panel.background = element_blank(), axis.line = element_line(colour = "black")) 
  guides(col = guide_legend(nrow = 8))
$colour
$title
list()
attr(,"class")
[1] "waiver"

$title.position
NULL

$title.theme
NULL

$title.hjust
NULL

$title.vjust
NULL

$label
[1] TRUE

$label.position
NULL

$label.theme
NULL

$label.hjust
NULL

$label.vjust
NULL

$keywidth
NULL

$keyheight
NULL

$direction
NULL

$override.aes
named list()

$nrow
[1] 8

$ncol
NULL

$byrow
[1] FALSE

$reverse
[1] FALSE

$order
[1] 0

$available_aes
[1] "any"

$name
[1] "legend"

attr(,"class")
[1] "guide"  "legend"

attr(,"class")
[1] "guides"
graph
ggsave("wage_all.png", width = 9, height = 5)

#install.packages("ggplotFL", repos="http://flr-project.org/R")
library(ggplotFL)
Loading required package: FLCore
Loading required package: lattice
Loading required package: iterators
FLCore (Version 2.6.15, packaged: 2020-05-26 19:36:47 UTC)

Attaching package: 㤼㸱FLCore㤼㸲

The following objects are masked from 㤼㸱package:dplyr㤼㸲:

    combine, desc, n

The following object is masked from 㤼㸱package:purrr㤼㸲:

    simplify

The following object is masked from 㤼㸱package:tidyr㤼㸲:

    spread
G <- ggplot(real.wage.long, aes(x=Year, y=Wage)) +
  geom_flquantiles(probs=c(0.25, 0.50, 0.75), fill="red", alpha=0.25, show.legend=TRUE) + labs(x = "Time",
y = "Real wage", color="") + theme_classic()
G
ggsave("quantile.png")
Saving 5.26 x 3.25 in image

library(skimr)
package 㤼㸱skimr㤼㸲 was built under R version 4.0.2
desc <- real.wage.long %>% 
  group_by(Province) %>% 
  skim() 
desc <- desc %>% 
  select(!c(4:8))
desc <- desc %>% 
 drop_na() %>% 
  write_excel_csv2("desc_stat.csv")

#Transform the wage series to log

real.wage.log <- log(real.wage[,-1])
real.wage.log

#Remove short-run noise using HP filter

f.real.wage.log <- apply(real.wage.log, 1, 
function(x){mFilter::hpfilter(x, freq=6.25, type="lambda")$trend} ) 
f.real.wage.log <- data.frame(Province = real.wage[,1], t(f.real.wage.log), stringsAsFactors=FALSE ) 
colnames(f.real.wage.log) <- colnames(real.wage) 

#Inspect the filtered data

head(f.real.wage.log)

#Run the log-t-test

H.real <- computeH(f.real.wage.log[,-1], quantity = "H")
round(estimateMod(H.real, time_trim=0.333, HACmethod = "FQSB"), 3)
   beta std.err  tvalue  pvalue 
 -1.130   0.014 -79.721   0.000 

#find convergence clubs

clubs.real <- findClubs(f.real.wage.log, dataCols=2:14, unit_names = 1, refCol=14,
time_trim=0.333, cstar=0, HACmethod = 'FQSB')
summary(clubs.real)
Number of convergence clubs: 3
Number of divergent units: 0

        | # of units  | beta     | std.err  | tvalue   | cstar  
-------- ------------- ---------- ---------- ---------- --------
 club1  |   3         |   0.113  |   0.232  |   0.486  |   0    
 club2  |   9         |   0.745  |   0.242  |   3.081  |   0    
 club3  |   22        |  -0.014  |   0.108  |  -0.126  |   0    

#We find three club convergence fo nominal wage

#Show the membership (provinces) of each club

print(clubs.real)
====================================================== 
club 1
------------------------------------------------------ 
Jakarta, Riau Islands, Banten

beta:      0.1128 
std.err:   0.232 
tvalue:    0.4863 
pvalue:    0.6866 
cstar:     0 

====================================================== 
club 2
------------------------------------------------------ 
Papua, East Kalimantan, North Kalimantan, West Java, 
West Papua, North Sulawesi, Bali, Central Kalimantan, 
South Sulawesi

beta:      0.7446 
std.err:   0.2417 
tvalue:    3.0808 
pvalue:    0.999 
cstar:     0 

====================================================== 
club 3
------------------------------------------------------ 
North Maluku, Riau, Maluku, West Sulawesi, South 
Kalimantan, Bangka Belitung, Southeast Sulawesi, West 
Sumatra, Aceh, Gorontalo, East Java, North Sumatra, 
Bengkulu, Yogyakarta, Central Java, South Sumatra, 
West Nusa Tenggara, Jambi, Lampung, Central Sulawesi, 
West Kalimantan, East Nusa Tenggara

beta:     -0.0136 
std.err:   0.1079 
tvalue:   -0.1261 
pvalue:    0.4498 
cstar:     0 
plot(clubs.real)

plot(clubs.real, clubs=NULL, avgTP = TRUE, legend=TRUE)

#Merge clubs

mclubs.real <- mergeClubs(clubs.real, mergeMethod='PS')
summary(mclubs.real)
Number of convergence clubs: 3
Number of divergent units: 0

        | merged clubs  | # of units  | beta     | std.err  | tvalue   
-------- --------------- ------------- ---------- ---------- ----------
 club1  | clubs: 1      |   3         |   0.113  |   0.232  |   0.486  
 club2  | clubs: 2      |   9         |   0.745  |   0.242  |   3.081  
 club3  | clubs: 3      |   22        |  -0.014  |   0.108  |  -0.126  
mclubs.real
================================================= 
club 1
------------------------------------------------- 
Jakarta, Riau Islands, Banten

beta:      0.1128 
std.err:   0.232 
tvalue:    0.4863 
pvalue:    0.6866 

================================================= 
club 2
------------------------------------------------- 
Papua, East Kalimantan, North Kalimantan, West 
Java, West Papua, North Sulawesi, Bali, Central 
Kalimantan, South Sulawesi

beta:      0.7446 
std.err:   0.2417 
tvalue:    3.0808 
pvalue:    0.999 

================================================= 
club 3
------------------------------------------------- 
North Maluku, Riau, Maluku, West Sulawesi, South 
Kalimantan, Bangka Belitung, Southeast Sulawesi, 
West Sumatra, Aceh, Gorontalo, East Java, North 
Sumatra, Bengkulu, Yogyakarta, Central Java, 
South Sumatra, West Nusa Tenggara, Jambi, 
Lampung, Central Sulawesi, West Kalimantan, East 
Nusa Tenggara

beta:     -0.0136 
std.err:   0.1079 
tvalue:   -0.1261 
pvalue:    0.4498 
plot(mclubs.real)

plot(mclubs.real, clubs=NULL, avgTP = TRUE, legend=TRUE)

#Convert clubs from list object to dataframe

table.mclubs.real <- map(mclubs.real, as.data.table)
Item 2 has 3 rows but longest item has 4; recycled with remainder.Item 4 has 3 rows but longest item has 4; recycled with remainder.Item 3 has 4 rows but longest item has 9; recycled with remainder.Item 3 has 4 rows but longest item has 22; recycled with remainder.
df.mclubs.real <- rbindlist(table.mclubs.real, fill = T, idcol = T)
df.mclubs.real
colnames(df.mclubs.real)[c(1,5)] <- c("Club","Province")
df.mclubs.real
real.wage.club <- as.data.frame(
  inner_join(f.real.wage.log, df.mclubs.real, by="Province") %>% 
  select(-contains(c("clubs","id","model")))
  ) 
real.wage.club
real.wage.club$Club <- gsub("club", "Club ", real.wage.club$Club)
real.wage.club

#Transition path of all clubs

relative.real <- list()
for(a in 2:14) {
  relative.real[[a]] <- data.frame(real.wage.club$Province, real.wage.club[,a]/mean(real.wage.club[,a]))
colnames(relative.real[[a]])[1]<- "Province"
colnames(relative.real[[a]])[2]<- 
paste("rel",colnames(real.wage.club)[a],sep="_")
}

for (x in 2:13) {
  relative.real[[x+1]]<-left_join(relative.real[[x]],relative.real[[x+1]], by="Province")
}
table.relative.real <- map(relative.real, as.data.table)
df.relative.real <- rbindlist(table.relative.real, fill = T, idcol = T) %>% drop_na()
library(plyr)
package 㤼㸱plyr㤼㸲 was built under R version 4.0.4----------------------------------------------------
You have loaded plyr after dplyr - this is likely to cause problems.
If you need functions from both plyr and dplyr, please load plyr first, then dplyr:
library(plyr); library(dplyr)
----------------------------------------------------

Attaching package: 㤼㸱plyr㤼㸲

The following objects are masked from 㤼㸱package:dplyr㤼㸲:

    arrange, count, desc, failwith, id, mutate,
    rename, summarise, summarize

The following object is masked from 㤼㸱package:purrr㤼㸲:

    compact
df.relative.real <- join(df.relative.real,real.wage.club,by=c('Province')) %>% 
  select(Province,contains("rel"),Club)
  
df.relative.real <- as.data.frame(df.relative.real)
colnames(df.relative.real) <- gsub("rel_","",colnames(df.relative.real))
df.relative.real
df.relative.real.long <- df.relative.real %>%  pivot_longer(-c(Province,Club), names_to = "Time", values_to="Rel_Wage")
df.relative.real.long
df.relative.real.path <- aggregate(Rel_Wage ~ Club + Time, df.relative.real.long, mean) %>% 
  arrange(Club)
path_all.real <- df.relative.real.path %>% 
  ggplot(aes(x=Time,y=Rel_Wage, group=Club, col=Club)) + geom_line() +
labs(x = "Time",
y = "Relative transition paths of all clubs", color="") +
theme(text=element_text( family="Palatino")) + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
panel.background = element_blank(), axis.line = element_line(colour = "black")) 
  guides(col = guide_legend(nrow = 8))
$colour
$title
list()
attr(,"class")
[1] "waiver"

$title.position
NULL

$title.theme
NULL

$title.hjust
NULL

$title.vjust
NULL

$label
[1] TRUE

$label.position
NULL

$label.theme
NULL

$label.hjust
NULL

$label.vjust
NULL

$keywidth
NULL

$keyheight
NULL

$direction
NULL

$override.aes
named list()

$nrow
[1] 8

$ncol
NULL

$byrow
[1] FALSE

$reverse
[1] FALSE

$order
[1] 0

$available_aes
[1] "any"

$name
[1] "legend"

attr(,"class")
[1] "guide"  "legend"

attr(,"class")
[1] "guides"
path_all.real
ggsave("path_all.real.png", width = 9, height = 5)

#Transition path of each club #Club 1

club1.real <- real.wage.club %>% 
  filter(Club == "Club 1")
relative.club1.real <- list()
for(a in 2:14) {
  relative.club1.real[[a]] <- data.frame(club1.real$Province, club1.real[,a]/mean(club1.real[,a]))
colnames(relative.club1.real[[a]])[1]<- "Province"
colnames(relative.club1.real[[a]])[2]<- 
paste("rel",colnames(club1.real)[a],sep="_")
}

for (x in 2:13) {
  relative.club1.real[[x+1]]<-left_join(relative.club1.real[[x]],relative.club1.real[[x+1]], by="Province")
}
table.relative.club1.real <- map(relative.club1.real, as.data.table)
df.relative.club1.real <- rbindlist(table.relative.club1.real, fill = T, idcol = T) %>% drop_na()
library(plyr)
df.relative.club1.real <- join(df.relative.club1.real,club1.real,by=c('Province')) %>% 
  select(Province,contains("rel"),Club)
  
df.relative.club1.real
colnames(df.relative.club1.real) <- gsub("rel_","",colnames(df.relative.club1.real))
df.relative.club1.real
df.relative.club1.real.long <- df.relative.club1.real %>%  pivot_longer(-c(Province,Club), names_to = "Time", values_to="Rel_Wage")
df.relative.club1.real.long
df.relative.club1.real.path <- aggregate(Rel_Wage ~ Province + Time, df.relative.club1.real.long, mean) %>% 
  arrange(Province)
a <- path_club1.real <- df.relative.club1.real.path %>% 
  ggplot(aes(x=Time,y=Rel_Wage, group=Province, col=Province)) + geom_line() +
labs(x = "Time",
y = "Relative transition paths of provinces in Club 1", color="") +
theme(text=element_text( family="Palatino")) + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
panel.background = element_blank(), axis.line = element_line(colour = "black")) 
  guides(col = guide_legend(nrow = 8))
$colour
$title
list()
attr(,"class")
[1] "waiver"

$title.position
NULL

$title.theme
NULL

$title.hjust
NULL

$title.vjust
NULL

$label
[1] TRUE

$label.position
NULL

$label.theme
NULL

$label.hjust
NULL

$label.vjust
NULL

$keywidth
NULL

$keyheight
NULL

$direction
NULL

$override.aes
named list()

$nrow
[1] 8

$ncol
NULL

$byrow
[1] FALSE

$reverse
[1] FALSE

$order
[1] 0

$available_aes
[1] "any"

$name
[1] "legend"

attr(,"class")
[1] "guide"  "legend"

attr(,"class")
[1] "guides"
path_club1.real

#ggsave("path_club1.real.png", width = 9, height = 5)

#Club 2

club2.real <- real.wage.club %>% 
  filter(Club == "Club 2")
relative.club2.real <- list()
for(a in 2:14) {
  relative.club2.real[[a]] <- data.frame(club2.real$Province, club2.real[,a]/mean(club2.real[,a]))
colnames(relative.club2.real[[a]])[1]<- "Province"
colnames(relative.club2.real[[a]])[2]<- 
paste("rel",colnames(club2.real)[a],sep="_")
}

for (x in 2:13) {
  relative.club2.real[[x+1]]<-left_join(relative.club2.real[[x]],relative.club2.real[[x+1]], by="Province")
}
table.relative.club2.real <- map(relative.club2.real, as.data.table)
df.relative.club2.real <- rbindlist(table.relative.club2.real, fill = T, idcol = T) %>% drop_na()
library(plyr)
df.relative.club2.real <- join(df.relative.club2.real,club2.real,by=c('Province')) %>% 
  select(Province,contains("rel"),Club)
  
df.relative.club2.real
colnames(df.relative.club2.real) <- gsub("rel_","",colnames(df.relative.club2.real))
df.relative.club2.real
df.relative.club2.real.long <- df.relative.club2.real %>%  pivot_longer(-c(Province,Club), names_to = "Time", values_to="Rel_Wage")
df.relative.club2.real.long
df.relative.club2.real.path <- aggregate(Rel_Wage ~ Province + Time, df.relative.club2.real.long, mean) %>% 
  arrange(Province)
b<-path_club2.real <- df.relative.club2.real.path %>% 
  ggplot(aes(x=Time,y=Rel_Wage, group=Province, col=Province)) + geom_line() +
labs(x = "Time",
y = "Relative transition paths of provinces in Club 2", color="") +
theme(text=element_text( family="Palatino")) + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
panel.background = element_blank(), axis.line = element_line(colour = "black")) 
  guides(col = guide_legend(nrow = 8))
$colour
$title
list()
attr(,"class")
[1] "waiver"

$title.position
NULL

$title.theme
NULL

$title.hjust
NULL

$title.vjust
NULL

$label
[1] TRUE

$label.position
NULL

$label.theme
NULL

$label.hjust
NULL

$label.vjust
NULL

$keywidth
NULL

$keyheight
NULL

$direction
NULL

$override.aes
named list()

$nrow
[1] 8

$ncol
NULL

$byrow
[1] FALSE

$reverse
[1] FALSE

$order
[1] 0

$available_aes
[1] "any"

$name
[1] "legend"

attr(,"class")
[1] "guide"  "legend"

attr(,"class")
[1] "guides"
path_club2.real
ggsave("path_club2.real.png", width = 9, height = 5)

library(plotly)

Attaching package: 㤼㸱plotly㤼㸲

The following objects are masked from 㤼㸱package:plyr㤼㸲:

    arrange, mutate, rename, summarise

The following object is masked from 㤼㸱package:ggplot2㤼㸲:

    last_plot

The following object is masked from 㤼㸱package:stats㤼㸲:

    filter

The following object is masked from 㤼㸱package:graphics㤼㸲:

    layout
ggplotly(b)
`group_by_()` was deprecated in dplyr 0.7.0.
Please use `group_by()` instead.
See vignette('programming') for more help

#Club 3

club3.real <- real.wage.club %>% 
  filter(Club == "Club 3")
relative.club3.real <- list()
for(a in 2:14) {
  relative.club3.real[[a]] <- data.frame(club3.real$Province, club3.real[,a]/mean(club3.real[,a]))
colnames(relative.club3.real[[a]])[1]<- "Province"
colnames(relative.club3.real[[a]])[2]<- 
paste("rel",colnames(club3.real)[a],sep="_")
}

for (x in 2:13) {
  relative.club3.real[[x+1]]<-left_join(relative.club3.real[[x]],relative.club3.real[[x+1]], by="Province")
}
table.relative.club3.real <- map(relative.club3.real, as.data.table)
df.relative.club3.real <- rbindlist(table.relative.club3.real, fill = T, idcol = T) %>% drop_na()
library(plyr)
df.relative.club3.real <- join(df.relative.club3.real,club3.real,by=c('Province')) %>% 
  select(Province,contains("rel"),Club)
  
df.relative.club3.real
colnames(df.relative.club3.real) <- gsub("rel_","",colnames(df.relative.club3.real))
df.relative.club3.real
df.relative.club3.real.long <- df.relative.club3.real %>%  pivot_longer(-c(Province,Club), names_to = "Time", values_to="Rel_Wage")
df.relative.club3.real.long
df.relative.club3.real.path <- aggregate(Rel_Wage ~ Province + Time, df.relative.club3.real.long, mean) %>% 
  arrange(Province)
c <- path_club3.real <- df.relative.club3.real.path %>% 
  ggplot(aes(x=Time,y=Rel_Wage, group=Province, col=Province)) + geom_line() +
labs(x = "Time",
y = "Relative transition paths of provinces in Club 3", color="") +
theme(text=element_text( family="Palatino")) + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
panel.background = element_blank(), axis.line = element_line(colour = "black")) 
  guides(col = guide_legend(nrow = 8))
$colour
$title
list()
attr(,"class")
[1] "waiver"

$title.position
NULL

$title.theme
NULL

$title.hjust
NULL

$title.vjust
NULL

$label
[1] TRUE

$label.position
NULL

$label.theme
NULL

$label.hjust
NULL

$label.vjust
NULL

$keywidth
NULL

$keyheight
NULL

$direction
NULL

$override.aes
named list()

$nrow
[1] 8

$ncol
NULL

$byrow
[1] FALSE

$reverse
[1] FALSE

$order
[1] 0

$available_aes
[1] "any"

$name
[1] "legend"

attr(,"class")
[1] "guide"  "legend"

attr(,"class")
[1] "guides"
path_club3.real

#ggsave("path_club3.real.png", width = 9, height = 5)
ggplotly(c)

Logit model

Load the data

library(readxl)
logit <- read_excel("WS Labour_new.xlsx", 
    sheet = "logit")
logit
Error in gregexpr(calltext, singleline, fixed = TRUE) : 
  regular expression is invalid UTF-8
logit$clubs_real <- factor(logit$clubs_real)
logit$clubs_real08 <- factor(logit$clubs_real08)
logit <- logit %>% 
  mutate(lngrdp = log(grdp))
glimpse(logit)
Rows: 34
Columns: 129
$ Region                 <chr> "SUMATERA", "SUMATERA~
$ Provinsi               <chr> "Aceh", "Sumatera Uta~
$ Province               <chr> "Aceh", "North Sumatr~
$ club                   <dbl> 2, 2, 2, 2, 2, 2, 2, ~
$ clubs                  <dbl> 0, 0, 0, 0, 0, 0, 0, ~
$ club_real              <dbl> 3, 3, 3, 3, 3, 3, 3, ~
$ clubs_real             <fct> 1, 1, 1, 1, 1, 1, 1, ~
$ club_real08            <dbl> 3, 3, 3, 3, 3, 3, 3, ~
$ clubs_real08           <fct> 1, 1, 1, 1, 1, 1, 1, ~
$ manu_gdp               <dbl> 7.362962, 20.058227, ~
$ min_gdp                <dbl> 10.4860421, 1.2372179~
$ export_gdp             <dbl> 6.576492, 29.809383, ~
$ pma_usd_thousand       <dbl> 58750.51, 742857.40, ~
$ pma_share_nat          <dbl> 0.2156826, 2.7687438,~
$ ipm                    <dbl> 71.12000, 72.37333, 7~
$ manu_g                 <dbl> -4.428821, 3.250070, ~
$ min_g                  <dbl> -8.9143761, 7.0445609~
$ export_g               <dbl> 2.241099, 5.021958, 4~
$ pma_usd_g              <dbl> 241.756878, 47.141298~
$ inflation              <dbl> 4.395791, 5.039509, 5~
$ cpi_2008               <dbl> 134.0060, 125.2408, 1~
$ real_wage_2008         <dbl> 1006.5969, 872.7189, ~
$ ump_2008               <dbl> 1000000, 822205, 8000~
$ lbr_prod_2008          <dbl> 64486623, 53444257, 4~
$ yos_2008               <dbl> 8.50, 8.60, 8.26, 8.5~
$ gdp_2008               <dbl> 104597.17, 296095.24,~
$ gdrp                   <dbl> 116485907, 441522073,~
$ gdrp_yoy               <dbl> 1.296245, 5.151837, 5~
$ pmtb_gdrp              <dbl> 31.96295, 29.88666, 2~
$ gdrp_2008              <dbl> 101545237, 331085237,~
$ gdrp_yoy_2008          <dbl> 1.293150, 6.382524, 5~
$ pmtb_gdrp_2008         <dbl> 28.92855, 29.89249, 2~
$ lab_force              <dbl> 2177867.2, 6779890.3,~
$ spa_rwage_knn6         <dbl> 1165.678, 1173.689, 1~
$ spa_rwage_inv          <dbl> 1066.1195, 1075.1873,~
$ tpak                   <dbl> 64.75956, 71.45083, 6~
$ emp_manu               <dbl> 5.058010, 8.072072, 7~
$ emp_agri               <dbl> 44.8070641, 43.037187~
$ emp_cons               <dbl> 6.634741, 5.541747, 5~
$ emp_min                <dbl> 0.7620963, 0.5675358,~
$ emp_trade              <dbl> 16.80033, 20.53636, 2~
$ emp_electricity        <dbl> 0.2737769, 0.2907925,~
$ emp_fin                <dbl> 1.206397, 1.778340, 1~
$ emp_soc_service        <dbl> 20.41898, 14.80034, 1~
$ emp_transcom           <dbl> 4.014083, 5.087083, 4~
$ grdp                   <dbl> 28744.308, 108075.305~
$ grdp_g                 <dbl> 2.975360, 5.576577, 5~
$ geninf                 <dbl> 3.948053, 5.214585, 5~
$ lend_g                 <dbl> 9.778968, 11.768034, ~
$ pcons_gdp              <dbl> 55.37660, 51.73854, 5~
$ inv_gdp                <dbl> 32.20730, 29.78758, 2~
$ totexp_gdp             <dbl> 43.00046, 43.88465, 6~
$ totimp_gdp             <dbl> 52.14954, 35.77006, 6~
$ domexp_gdp             <dbl> 37.990005, 21.226572,~
$ domimp_gdp             <dbl> 50.529657, 23.478050,~
$ forexp_gdp             <dbl> 4.995589, 22.572318, ~
$ forimp_gdp             <dbl> 1.6173898, 12.2851855~
$ agri_gdp               <dbl> 26.73008886, 25.10708~
$ mining_gdp             <dbl> 10.4379411, 1.2370177~
$ manu_gdp_              <dbl> 6.685383, 19.738269, ~
$ constr_gdp             <dbl> 9.113256, 12.237966, ~
$ trade_gdp              <dbl> 16.081582, 19.688706,~
$ finance_gdp            <dbl> 5.778633, 7.987550, 5~
$ gen_serv_gdp           <dbl> 13.982372, 6.691810, ~
$ serv_gdp               <dbl> 19.761005, 14.679360,~
$ dom_open_gdp           <dbl> 0.8851966, 0.4470462,~
$ for_open_gdp           <dbl> 0.06612979, 0.3485750~
$ lend_gdp               <dbl> 27.17989, 38.15352, 3~
$ gdp_labor              <dbl> 57.77792, 71.24029, 6~
$ gdpc_15                <dbl> 23.09289, 31.22043, 2~
$ gdp_sq                 <dbl> 1989.642, 5956.191, 3~
$ pop_sq                 <dbl> 86.15821, 190.77867, ~
$ loan_gr                <dbl> 9.433056, 10.525256, ~
$ spain_knn4_poly        <dbl> 5.014805, 4.714136, 5~
$ spain_cont_poly        <dbl> 5.197999, 4.657841, 5~
$ spain_knn6_cent        <dbl> 5.043715, 4.843269, 4~
$ spain_dist_cent        <dbl> 5.080102, 4.714136, 4~
$ stdev_all_mtm          <dbl> 0.6469880, 0.7405477,~
$ stdev_all_yoy          <dbl> 1.567177, 2.195147, 2~
$ gcons_g                <dbl> 2.301336, 2.860688, 3~
$ gcons_grdp             <dbl> 18.834446, 6.917228, ~
$ grev_g                 <dbl> 9.531354, 16.068736, ~
$ gexp_g                 <dbl> 12.279301, 18.363550,~
$ gdirexp_g              <dbl> 11.66417, 13.77871, 1~
$ gindirexp_g            <dbl> 18.469691, 24.599792,~
$ lbr_prod_g             <dbl> 0.09523408, 3.2211592~
$ trans_cost18           <dbl> 440872.5, 1390255.1, ~
$ std_gdp_g              <dbl> 1.7815710, 0.5159887,~
$ gdp_g_stdev            <dbl> 1.7751960, 0.6697751,~
$ std_pcons_g            <dbl> 0.2628224, 0.4350649,~
$ pcons_g                <dbl> 3.358384, 5.019741, 4~
$ java                   <dbl> 0, 0, 0, 0, 0, 0, 0, ~
$ persistence_1          <dbl> 0.878934, 0.893040, 0~
$ pop_urban              <dbl> 28.11969, 45.21227, 3~
$ poverty                <dbl> 17.931111, 10.430000,~
$ small_micro_emp        <dbl> 7.833679, 4.127258, 7~
$ small_emp              <dbl> 0.8723249, 1.0417838,~
$ micro_emp              <dbl> 7.000823, 3.090453, 6~
$ grdp_gdp_2010          <dbl> 1.4793600, 4.8234093,~
$ grdp_gdp               <dbl> 1.3156809, 4.8910199,~
$ small_output           <dbl> 0.7238740, 2.8516091,~
$ micro_output           <dbl> 1.6259825, 3.0840862,~
$ small_micro_output     <dbl> 2.3498565, 5.9356953,~
$ small_output_gdp       <dbl> 1.3263031, 1.4291156,~
$ micro_output_gdp       <dbl> 4.0170421, 1.9707620,~
$ small_micro_output_gdp <dbl> 5.343345, 3.399878, 7~
$ manu_g_2010_2019       <dbl> -29.40203, 38.02209, ~
$ HHI                    <dbl> 1560.208, 1717.442, 1~
$ unemp                  <dbl> 8.215, 6.366, 6.374, ~
$ wage_hour              <dbl> 13657.8, 12619.6, 137~
$ HHI_avg                <dbl> 0.1578574, 0.1718802,~
$ HHI_g                  <dbl> 0.9210646, 1.0475247,~
$ nom_wage_g             <dbl> 8.357274, 7.442690, 8~
$ nom_wage19_15          <dbl> 35.35608, 32.40019, 3~
$ rel_nom_wage_g         <dbl> 0.79886539, 1.0814938~
$ formal_labor           <dbl> 41.238, 42.062, 36.66~
$ non_formal_job         <dbl> 41.758, 43.062, 49.69~
$ nom_wage_std           <dbl> 1556.2161, 1435.8815,~
$ nom_wage_std_p         <dbl> 1391.9220, 1284.2915,~
$ rel_wage_std           <dbl> 0.8873343, 0.8187211,~
$ unemp_aug_stdev        <dbl> 1.4678877, 0.8854277,~
$ unemp_aug_rel_stdev    <dbl> 1.9673017, 1.1866735,~
$ unemp_std              <dbl> 1.2763652, 0.8086662,~
$ unemp_rel_stdev        <dbl> 1.6937743, 1.0731239,~
$ real_wage_g            <dbl> 7.709113, 6.893801, 7~
$ real_rel_nom_wage_g    <dbl> 0.9565559, 0.8553910,~
$ real_wage_std          <dbl> 1404.6339, 1419.5468,~
$ real_rel_wage_std      <dbl> 0.8940879, 0.9035804,~
$ lngrdp                 <dbl> 10.266195, 11.590584,~
mylogit <- glm(clubs ~ real_wage_2008 + emp_manu + pmtb_gdrp  + tpak + lngrdp, data = logit, family = "binomial")
summary(mylogit)

Call:
glm(formula = clubs ~ real_wage_2008 + emp_manu + pmtb_gdrp + 
    tpak + lngrdp, family = "binomial", data = logit)

Deviance Residuals: 
     Min        1Q    Median        3Q       Max  
-1.71721  -0.12259  -0.01391   0.01037   1.86450  

Coefficients:
                Estimate Std. Error z value Pr(>|z|)
(Intercept)    -62.96071   33.60538  -1.874   0.0610
real_wage_2008   0.03756    0.01823   2.061   0.0393
emp_manu         0.56626    0.34138   1.659   0.0972
pmtb_gdrp        0.72022    0.39324   1.832   0.0670
tpak            -0.23156    0.12841  -1.803   0.0713
lngrdp           1.36255    1.07194   1.271   0.2037
                
(Intercept)    .
real_wage_2008 *
emp_manu       .
pmtb_gdrp      .
tpak           .
lngrdp          
---
Signif. codes:  
0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 44.149  on 33  degrees of freedom
Residual deviance: 13.631  on 28  degrees of freedom
AIC: 25.631

Number of Fisher Scoring iterations: 9
LS0tDQp0aXRsZTogIkNvbnZlcmdlbmNlIENsdWJzIG9mIHdhZ2UgaW4gMzQgSW5kb25lc2lhbiBQcm92aW5jZXMiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQojQWN0aXZhdGUgbmVjZXNzYXJ5IGxpYnJhcmllcw0KYGBge3J9DQpsaWJyYXJ5KENvbnZlcmdlbmNlQ2x1YnMpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoamFuaXRvcikNCmxpYnJhcnkodGliYmxlKQ0KbGlicmFyeShkYXRhLnRhYmxlKQ0KbGlicmFyeShFeFBhbkRhUikNCmBgYA0KDQoNCiNQYXJ0IEk6IE5vbWluYWwgV2FnZSB1c2luZyBkZWZpbml0aW9uICJBIiBvZiB3b3JrZXINCiNMb2FkIHRoZSBkYXRhDQpgYGB7cn0NCmxpYnJhcnkocmVhZHhsKQ0Kbm9taW5hbC53YWdlIDwtIHJlYWRfZXhjZWwoIldTIExhYm91cl9uZXcueGxzeCIsIA0KICAgIHNoZWV0ID0gIm5vbWluYWxfd2FnZV9BIikNCm5vbWluYWwud2FnZQ0KYGBgDQoNCiNTZWxlY3QgZGF0YSBvbmx5IGZyb20gMjAwOCBvbndhcmRzIGFuZCByZW1vdmUgIlJlZ2lvbiIgY29sdW1uLCBhbmQgcmVtb3ZlIHRoZSBvYnNlcnZhdGlvbiBvZiBJbmRvbmVzaWENCmBgYHtyfQ0Kbm9taW5hbC53YWdlIDwtIG5vbWluYWwud2FnZSAlPiUgDQogIHNlbGVjdCgtYygxLDM6NSkpICU+JSANCiAgc3Vic2V0KFByb3ZpbmNlIT0iTmF0aW9uYWwiKQ0KYGBgDQoNCiN0cmFuc2Zvcm0gdGhlIHdhZ2Ugc2VyaWVzIHRvIGxvZw0KYGBge3J9DQpub21pbmFsLndhZ2UubG9nIDwtIGxvZyhub21pbmFsLndhZ2VbLC0xXSkNCm5vbWluYWwud2FnZS5sb2cNCmBgYA0KDQojUmVtb3ZlIHNob3J0LXJ1biBub2lzZSB1c2luZyBIUCBmaWx0ZXINCmBgYHtyfQ0KZi5ub21pbmFsLndhZ2UubG9nIDwtIGFwcGx5KG5vbWluYWwud2FnZS5sb2csIDEsIA0KZnVuY3Rpb24oeCl7bUZpbHRlcjo6aHBmaWx0ZXIoeCwgZnJlcT02LjI1LCB0eXBlPSJsYW1iZGEiKSR0cmVuZH0gKSANCmYubm9taW5hbC53YWdlLmxvZyA8LSBkYXRhLmZyYW1lKFByb3ZpbmNlID0gbm9taW5hbC53YWdlWywxXSwgdChmLm5vbWluYWwud2FnZS5sb2cpLCBzdHJpbmdzQXNGYWN0b3JzPUZBTFNFICkgDQpjb2xuYW1lcyhmLm5vbWluYWwud2FnZS5sb2cpIDwtIGNvbG5hbWVzKG5vbWluYWwud2FnZSkgDQpgYGANCg0KI0luc3BlY3QgdGhlIGZpbHRlcmVkIGRhdGENCmBgYHtyfQ0KaGVhZChmLm5vbWluYWwud2FnZS5sb2cpDQpgYGANCg0KI1J1biB0aGUgbG9nLXQtdGVzdA0KYGBge3J9DQpILm5vbWluYWwgPC0gY29tcHV0ZUgoZi5ub21pbmFsLndhZ2UubG9nWywtMV0sIHF1YW50aXR5ID0gIkgiKQ0Kcm91bmQoZXN0aW1hdGVNb2QoSC5ub21pbmFsLCB0aW1lX3RyaW09MC4zMzMsIEhBQ21ldGhvZCA9ICJGUVNCIiksIDMpDQpgYGANCg0KI2ZpbmQgY29udmVyZ2VuY2UgY2x1YnMNCmBgYHtyfQ0KY2x1YnMubm9taW5hbCA8LSBmaW5kQ2x1YnMoZi5ub21pbmFsLndhZ2UubG9nLCBkYXRhQ29scz0yOjE0LCB1bml0X25hbWVzID0gMSwgcmVmQ29sPTE0LA0KdGltZV90cmltPTAuMzMzLCBjc3Rhcj0wLCBIQUNtZXRob2QgPSAnRlFTQicpDQpgYGANCg0KYGBge3J9DQpzdW1tYXJ5KGNsdWJzLm5vbWluYWwpDQpgYGANCg0KYGBge3J9DQpwcmludChjbHVicy5ub21pbmFsKQ0KYGBgDQoNCmBgYHtyfQ0KcGxvdChjbHVicy5ub21pbmFsKQ0KYGBgDQoNCmBgYHtyfQ0KcGxvdChjbHVicy5ub21pbmFsLCBjbHVicz1OVUxMLCBhdmdUUCA9IFRSVUUsIGxlZ2VuZD1UUlVFKQ0KYGBgDQoNCiNNZXJnZSBjbHVicw0KYGBge3J9DQptY2x1YnMubm9taW5hbCA8LSBtZXJnZUNsdWJzKGNsdWJzLm5vbWluYWwsIG1lcmdlTWV0aG9kPSdQUycpDQpzdW1tYXJ5KG1jbHVicy5ub21pbmFsKQ0KYGBgDQoNCmBgYHtyfQ0KbWNsdWJzLm5vbWluYWwNCmBgYA0KDQpgYGB7cn0NCnBsb3QobWNsdWJzLm5vbWluYWwpDQpgYGANCg0KYGBge3J9DQpwbG90KG1jbHVicy5ub21pbmFsLCBjbHVicz1OVUxMLCBhdmdUUCA9IFRSVUUsIGxlZ2VuZD1UUlVFKQ0KYGBgDQoNCi0tLS0tLS0tLS0tLS0tDQojUGFydCBJSTogUmVhbCBXYWdlIHVzaW5nIGRlZmluaXRpb24gIkEiIG9mIHdvcmtlcg0KI0xvYWQgdGhlIGRhdGENCmBgYHtyfQ0KbGlicmFyeShyZWFkeGwpDQpyZWFsLndhZ2UgPC0gcmVhZF9leGNlbCgiV1MgTGFib3VyX25ldy54bHN4IiwgDQogICAgc2hlZXQgPSAicmVhbF93YWdlX0EiKQ0KcmVhbC53YWdlDQpgYGANCg0KI1NlbGVjdCBkYXRhIG9ubHkgZnJvbSAyMDA4IG9ud2FyZHMgYW5kIHJlbW92ZSAiUmVnaW9uIiBjb2x1bW4sIGFuZCByZW1vdmUgdGhlIG9ic2VydmF0aW9uIG9mIEluZG9uZXNpYQ0KYGBge3J9DQpyZWFsLndhZ2UgPC0gcmVhbC53YWdlICU+JSANCiAgc2VsZWN0KC1jKDEsMzo1KSkgJT4lIA0KICBzdWJzZXQoUHJvdmluY2UhPSJOYXRpb25hbCIpDQpgYGANCg0KI3RyYW5zZm9ybSB0aGUgd2FnZSBzZXJpZXMgdG8gbG9nDQpgYGB7cn0NCnJlYWwud2FnZS5sb2cgPC0gbG9nKHJlYWwud2FnZVssLTFdKQ0KcmVhbC53YWdlLmxvZw0KYGBgDQoNCiNSZW1vdmUgc2hvcnQtcnVuIG5vaXNlIHVzaW5nIEhQIGZpbHRlcg0KYGBge3J9DQpmLnJlYWwud2FnZS5sb2cgPC0gYXBwbHkocmVhbC53YWdlLmxvZywgMSwgDQpmdW5jdGlvbih4KXttRmlsdGVyOjpocGZpbHRlcih4LCBmcmVxPTYuMjUsIHR5cGU9ImxhbWJkYSIpJHRyZW5kfSApIA0KZi5yZWFsLndhZ2UubG9nIDwtIGRhdGEuZnJhbWUoUHJvdmluY2UgPSByZWFsLndhZ2VbLDFdLCB0KGYucmVhbC53YWdlLmxvZyksIHN0cmluZ3NBc0ZhY3RvcnM9RkFMU0UgKSANCmNvbG5hbWVzKGYucmVhbC53YWdlLmxvZykgPC0gY29sbmFtZXMocmVhbC53YWdlKSANCmBgYA0KDQojSW5zcGVjdCB0aGUgZmlsdGVyZWQgZGF0YQ0KYGBge3J9DQpoZWFkKGYucmVhbC53YWdlLmxvZykNCmBgYA0KDQojUnVuIHRoZSBsb2ctdC10ZXN0DQpgYGB7cn0NCkgucmVhbCA8LSBjb21wdXRlSChmLnJlYWwud2FnZS5sb2dbLC0xXSwgcXVhbnRpdHkgPSAiSCIpDQpyb3VuZChlc3RpbWF0ZU1vZChILnJlYWwsIHRpbWVfdHJpbT0wLjMzMywgSEFDbWV0aG9kID0gIkZRU0IiKSwgMykNCmBgYA0KDQojZmluZCBjb252ZXJnZW5jZSBjbHVicw0KYGBge3J9DQpjbHVicy5yZWFsIDwtIGZpbmRDbHVicyhmLnJlYWwud2FnZS5sb2csIGRhdGFDb2xzPTI6MTQsIHVuaXRfbmFtZXMgPSAxLCByZWZDb2w9MTQsDQp0aW1lX3RyaW09MC4zMzMsIGNzdGFyPTAsIEhBQ21ldGhvZCA9ICdGUVNCJykNCmBgYA0KDQpgYGB7cn0NCnN1bW1hcnkoY2x1YnMucmVhbCkNCmBgYA0KDQpgYGB7cn0NCnByaW50KGNsdWJzLnJlYWwpDQpgYGANCg0KYGBge3J9DQpwbG90KGNsdWJzLnJlYWwpDQpgYGANCg0KYGBge3J9DQpwbG90KGNsdWJzLnJlYWwsIGNsdWJzPU5VTEwsIGF2Z1RQID0gVFJVRSwgbGVnZW5kPVRSVUUpDQpgYGANCg0KI01lcmdlIGNsdWJzDQpgYGB7cn0NCm1jbHVicy5yZWFsIDwtIG1lcmdlQ2x1YnMoY2x1YnMucmVhbCwgbWVyZ2VNZXRob2Q9J1BTJykNCnN1bW1hcnkobWNsdWJzLnJlYWwpDQpgYGANCg0KYGBge3J9DQptY2x1YnMucmVhbA0KYGBgDQoNCmBgYHtyfQ0KcGxvdChtY2x1YnMucmVhbCkNCmBgYA0KDQpgYGB7cn0NCnBsb3QobWNsdWJzLnJlYWwsIGNsdWJzPU5VTEwsIGF2Z1RQID0gVFJVRSwgbGVnZW5kPVRSVUUpDQpgYGANCg0KYGBge3J9DQpjbGFzcyhtY2x1YnMubm9taW5hbCkNCmBgYA0KDQpgYGB7cn0NCnRhYmxlLm1jbHVicy5ub20gPC0gbWFwKG1jbHVicy5ub21pbmFsLCBhcy5kYXRhLnRhYmxlKQ0KZGYubWNsdWJzLm5vbSA8LSByYmluZGxpc3QodGFibGUubWNsdWJzLm5vbSwgZmlsbCA9IFQsIGlkY29sID0gVCkNCmRmLm1jbHVicy5ub20NCmBgYA0KYGBge3J9DQpjb2xuYW1lcyhkZi5tY2x1YnMubm9tKVs1XSA8LSAiUHJvdmluY2UiDQpkZi5tY2x1YnMubm9tDQpgYGANCg0KDQpgYGB7cn0NCm5vbWluYWwud2FnZS5jbHViIDwtIGFzLmRhdGEuZnJhbWUoDQogIGlubmVyX2pvaW4oZi5ub21pbmFsLndhZ2UubG9nLCBkZi5tY2x1YnMubm9tLCBieT0iUHJvdmluY2UiKSAlPiUgDQogIHNlbGVjdCgtY29udGFpbnMoYygiaWQiLCJtb2RlbCIpKSkNCiAgKSANCm5vbWluYWwud2FnZS5jbHViDQpgYGANCg0KI0dlbmVyYXRlIHJlbGF0aXZlIHZhbHVlIGZvciBhbGwgY2x1YnMNCmBgYHtyfQ0KcmVsYXRpdmUgPC0gbGlzdCgpDQpmb3IoYSBpbiAyOjE0KSB7DQogIHJlbGF0aXZlW1thXV0gPC0gZGF0YS5mcmFtZShub21pbmFsLndhZ2UuY2x1YiRQcm92aW5jZSwgbm9taW5hbC53YWdlLmNsdWJbLGFdL21lYW4obm9taW5hbC53YWdlLmNsdWJbLGFdKSkNCmNvbG5hbWVzKHJlbGF0aXZlW1thXV0pWzFdPC0gIlByb3ZpbmNlIg0KY29sbmFtZXMocmVsYXRpdmVbW2FdXSlbMl08LSANCnBhc3RlKCJyZWwiLGNvbG5hbWVzKG5vbWluYWwud2FnZS5jbHViKVthXSxzZXA9Il8iKQ0KfQ0KDQpmb3IgKHggaW4gMjoxMykgew0KICByZWxhdGl2ZVtbeCsxXV08LWxlZnRfam9pbihyZWxhdGl2ZVtbeF1dLHJlbGF0aXZlW1t4KzFdXSwgYnk9IlByb3ZpbmNlIikNCn0NCmBgYA0KDQpgYGB7cn0NCnRhYmxlLnJlbGF0aXZlIDwtIG1hcChyZWxhdGl2ZSwgYXMuZGF0YS50YWJsZSkNCmRmLnJlbGF0aXZlIDwtIHJiaW5kbGlzdCh0YWJsZS5yZWxhdGl2ZSwgZmlsbCA9IFQsIGlkY29sID0gVCkgJT4lIGRyb3BfbmEoKQ0KbGlicmFyeShwbHlyKQ0KZGYucmVsYXRpdmUgPC0gam9pbihkZi5yZWxhdGl2ZSxub21pbmFsLndhZ2UuY2x1YixieT1jKCdQcm92aW5jZScpKSAlPiUgDQogIHNlbGVjdChQcm92aW5jZSxjb250YWlucygicmVsIiksY2x1YnMpDQogIA0KZGYucmVsYXRpdmUgPC0gYXMuZGF0YS5mcmFtZShkZi5yZWxhdGl2ZSkNCmBgYA0KDQpgYGB7cn0NCmNvbG5hbWVzKGRmLnJlbGF0aXZlKSA8LSBnc3ViKCJyZWxfIiwiIixjb2xuYW1lcyhkZi5yZWxhdGl2ZSkpDQpkZi5yZWxhdGl2ZQ0KYGBgDQoNCmBgYHtyfQ0KZGYucmVsYXRpdmUubG9uZyA8LSBkZi5yZWxhdGl2ZSAlPiUgIHBpdm90X2xvbmdlcigtYyhQcm92aW5jZSxjbHVicyksIG5hbWVzX3RvID0gIlRpbWUiLCB2YWx1ZXNfdG89IlJlbF9XYWdlIikNCmRmLnJlbGF0aXZlLmxvbmcNCmBgYA0KDQpgYGB7cn0NCmRmLnJlbGF0aXZlLnBhdGggPC0gYWdncmVnYXRlKFJlbF9XYWdlIH4gY2x1YnMgKyBUaW1lLCBkZi5yZWxhdGl2ZS5sb25nLCBtZWFuKSAlPiUgDQogIGFycmFuZ2UoY2x1YnMpDQpgYGANCg0KYGBge3J9DQpwYXRoX2FsbCA8LSBkZi5yZWxhdGl2ZS5wYXRoICU+JSANCiAgZ2dwbG90KGFlcyh4PVRpbWUseT1SZWxfV2FnZSwgZ3JvdXA9Y2x1YnMsIGNvbD1jbHVicykpICsgZ2VvbV9saW5lKCkgKw0KICBsYWJzKHRpdGxlID0gIlRyYW5zaXRpb24gcGF0aCBvZiBhbGwgY2x1YnMiKSArDQogIHRoZW1lX2J3KCkNCnBhdGhfYWxsDQpnZ3NhdmUoInBhdGhfYWxsLnBuZyIsIHdpZHRoID0gOSwgaGVpZ2h0ID0gNSkNCmBgYA0KDQojR2VuZXJhdGUgcmVsYXRpdmUgdmFsdWUgZm9yIHdpdGhpbiBjbHViDQojQ3JlYXRlIGRhdGFmcmFtZSBmb3IgZWFjaCBjbHViDQpgYGB7cn0NCmNsdWIxIDwtIG5vbWluYWwud2FnZS5jbHViICU+JSANCiAgZmlsdGVyKGNsdWJzID09ICJjbHViMSIpDQpgYGANCg0KYGBge3J9DQpyZWxhdGl2ZS5jbHViMSA8LSBsaXN0KCkNCmZvcihhIGluIDI6MTQpIHsNCiAgcmVsYXRpdmUuY2x1YjFbW2FdXSA8LSBkYXRhLmZyYW1lKGNsdWIxJFByb3ZpbmNlLCBjbHViMVssYV0vbWVhbihjbHViMVssYV0pKQ0KY29sbmFtZXMocmVsYXRpdmUuY2x1YjFbW2FdXSlbMV08LSAiUHJvdmluY2UiDQpjb2xuYW1lcyhyZWxhdGl2ZS5jbHViMVtbYV1dKVsyXTwtIA0KcGFzdGUoInJlbCIsY29sbmFtZXMoY2x1YjEpW2FdLHNlcD0iXyIpDQp9DQoNCmZvciAoeCBpbiAyOjEzKSB7DQogIHJlbGF0aXZlLmNsdWIxW1t4KzFdXTwtbGVmdF9qb2luKHJlbGF0aXZlLmNsdWIxW1t4XV0scmVsYXRpdmUuY2x1YjFbW3grMV1dLCBieT0iUHJvdmluY2UiKQ0KfQ0KYGBgDQoNCg0KYGBge3J9DQp0YWJsZS5yZWxhdGl2ZS5jbHViMSA8LSBtYXAocmVsYXRpdmUuY2x1YjEsIGFzLmRhdGEudGFibGUpDQpkZi5yZWxhdGl2ZS5jbHViMSA8LSByYmluZGxpc3QodGFibGUucmVsYXRpdmUuY2x1YjEsIGZpbGwgPSBULCBpZGNvbCA9IFQpICU+JSBkcm9wX25hKCkNCmxpYnJhcnkocGx5cikNCmRmLnJlbGF0aXZlLmNsdWIxIDwtIGpvaW4oZGYucmVsYXRpdmUuY2x1YjEsY2x1YjEsYnk9YygnUHJvdmluY2UnKSkgJT4lIA0KICBzZWxlY3QoUHJvdmluY2UsY29udGFpbnMoInJlbCIpLGNsdWJzKQ0KICANCmRmLnJlbGF0aXZlLmNsdWIxDQpgYGANCg0KYGBge3J9DQpjb2xuYW1lcyhkZi5yZWxhdGl2ZS5jbHViMSkgPC0gZ3N1YigicmVsXyIsIiIsY29sbmFtZXMoZGYucmVsYXRpdmUuY2x1YjEpKQ0KZGYucmVsYXRpdmUuY2x1YjENCmBgYA0KDQpgYGB7cn0NCmRmLnJlbGF0aXZlLmNsdWIxLmxvbmcgPC0gZGYucmVsYXRpdmUuY2x1YjEgJT4lICBwaXZvdF9sb25nZXIoLWMoUHJvdmluY2UsY2x1YnMpLCBuYW1lc190byA9ICJUaW1lIiwgdmFsdWVzX3RvPSJSZWxfV2FnZSIpDQpkZi5yZWxhdGl2ZS5jbHViMS5sb25nDQpgYGANCg0KYGBge3J9DQpkZi5yZWxhdGl2ZS5jbHViMS5wYXRoIDwtIGFnZ3JlZ2F0ZShSZWxfV2FnZSB+IFByb3ZpbmNlICsgVGltZSwgZGYucmVsYXRpdmUuY2x1YjEubG9uZywgbWVhbikgJT4lIA0KICBhcnJhbmdlKFByb3ZpbmNlKQ0KYGBgDQoNCmBgYHtyfQ0KcGF0aF9jbHViMSA8LSBkZi5yZWxhdGl2ZS5jbHViMS5wYXRoICU+JSANCiAgZ2dwbG90KGFlcyh4PVRpbWUseT1SZWxfV2FnZSwgZ3JvdXA9UHJvdmluY2UsIGNvbD1Qcm92aW5jZSkpICsgZ2VvbV9saW5lKCkgKw0KICBsYWJzKHRpdGxlID0gIlRyYW5zaXRpb24gcGF0aCBvZiByZWdpb25zIGluIENsdWIgMSIpICsNCiAgdGhlbWVfYncoKSArDQogICB0aGVtZShsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDgpLCANCiAgICAgICAgICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA4KSkNCnBhdGhfY2x1YjENCmdnc2F2ZSgicGF0aF9jbHViMS5wbmciLCB3aWR0aCA9IDksIGhlaWdodCA9IDUpDQpgYGANCg0KDQpgYGB7cn0NCmNsdWIyIDwtIG5vbWluYWwud2FnZS5jbHViICU+JSANCiAgZmlsdGVyKGNsdWJzID09ICJjbHViMiIpDQpgYGANCg0KYGBge3J9DQpyZWxhdGl2ZS5jbHViMiA8LSBsaXN0KCkNCmZvcihhIGluIDI6MTQpIHsNCiAgcmVsYXRpdmUuY2x1YjJbW2FdXSA8LSBkYXRhLmZyYW1lKGNsdWIyJFByb3ZpbmNlLCBjbHViMlssYV0vbWVhbihjbHViMlssYV0pKQ0KY29sbmFtZXMocmVsYXRpdmUuY2x1YjJbW2FdXSlbMV08LSAiUHJvdmluY2UiDQpjb2xuYW1lcyhyZWxhdGl2ZS5jbHViMltbYV1dKVsyXTwtIA0KcGFzdGUoInJlbCIsY29sbmFtZXMoY2x1YjIpW2FdLHNlcD0iXyIpDQp9DQoNCmZvciAoeCBpbiAyOjEzKSB7DQogIHJlbGF0aXZlLmNsdWIyW1t4KzFdXTwtbGVmdF9qb2luKHJlbGF0aXZlLmNsdWIyW1t4XV0scmVsYXRpdmUuY2x1YjJbW3grMV1dLCBieT0iUHJvdmluY2UiKQ0KfQ0KYGBgDQoNCg0KYGBge3J9DQp0YWJsZS5yZWxhdGl2ZS5jbHViMiA8LSBtYXAocmVsYXRpdmUuY2x1YjIsIGFzLmRhdGEudGFibGUpDQpkZi5yZWxhdGl2ZS5jbHViMiA8LSByYmluZGxpc3QodGFibGUucmVsYXRpdmUuY2x1YjIsIGZpbGwgPSBULCBpZGNvbCA9IFQpICU+JSBkcm9wX25hKCkNCmxpYnJhcnkocGx5cikNCmRmLnJlbGF0aXZlLmNsdWIyIDwtIGpvaW4oZGYucmVsYXRpdmUuY2x1YjIsY2x1YjIsYnk9YygnUHJvdmluY2UnKSkgJT4lIA0KICBzZWxlY3QoUHJvdmluY2UsY29udGFpbnMoInJlbCIpLGNsdWJzKQ0KICANCmRmLnJlbGF0aXZlLmNsdWIyDQpgYGANCg0KYGBge3J9DQpjb2xuYW1lcyhkZi5yZWxhdGl2ZS5jbHViMikgPC0gZ3N1YigicmVsXyIsIiIsY29sbmFtZXMoZGYucmVsYXRpdmUuY2x1YjIpKQ0KZGYucmVsYXRpdmUuY2x1YjINCmBgYA0KDQpgYGB7cn0NCmRmLnJlbGF0aXZlLmNsdWIyLmxvbmcgPC0gZGYucmVsYXRpdmUuY2x1YjIgJT4lICBwaXZvdF9sb25nZXIoLWMoUHJvdmluY2UsY2x1YnMpLCBuYW1lc190byA9ICJUaW1lIiwgdmFsdWVzX3RvPSJSZWxfV2FnZSIpDQpkZi5yZWxhdGl2ZS5jbHViMi5sb25nDQpgYGANCg0KYGBge3J9DQpkZi5yZWxhdGl2ZS5jbHViMi5wYXRoIDwtIGFnZ3JlZ2F0ZShSZWxfV2FnZSB+IFByb3ZpbmNlICsgVGltZSwgZGYucmVsYXRpdmUuY2x1YjIubG9uZywgbWVhbikgJT4lIA0KICBhcnJhbmdlKFByb3ZpbmNlKQ0KYGBgDQoNCmBgYHtyfQ0KcGF0aF9jbHViMiA8LSBkZi5yZWxhdGl2ZS5jbHViMi5wYXRoICU+JSANCiAgZ2dwbG90KGFlcyh4PVRpbWUseT1SZWxfV2FnZSwgZ3JvdXA9UHJvdmluY2UsIGNvbD1Qcm92aW5jZSkpICsgZ2VvbV9saW5lKCkgKw0KICBsYWJzKHRpdGxlID0gIlRyYW5zaXRpb24gcGF0aCBvZiByZWdpb25zIGluIENsdWIgMiIpICsNCiAgdGhlbWVfYncoKSArDQogIHRoZW1lKGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNyksIA0KICAgICAgICAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcpKQ0KcGF0aF9jbHViMg0KZ2dzYXZlKCJwYXRoX2NsdWIyLnBuZyIsIHdpZHRoID0gOSwgaGVpZ2h0ID0gNSkNCmBgYA0KDQojUGFydCBJSTogUmVhbCBXYWdlIHVzaW5nIGRlZmluaXRpb24gIkEiIG9mIHdvcmtlcg0KI0xvYWQgdGhlIGRhdGENCmBgYHtyfQ0KbGlicmFyeShyZWFkeGwpDQpyZWFsLndhZ2UgPC0gcmVhZF9leGNlbCgiV1MgTGFib3VyX25ldy54bHN4IiwgDQogICAgc2hlZXQgPSAicmVhbF93YWdlX0EiKQ0KcmVhbC53YWdlDQpgYGANCg0KI1JlZ2lvbmFsIHdhZ2UgZmFjZXRlZCBieSByZWdpb24NCmBgYHtyfQ0KZGYgPC0gcmVhbC53YWdlICU+JSANCiAgc2VsZWN0KC1jKDM6NSkpICU+JSANCiAgc3Vic2V0KFByb3ZpbmNlIT0iTmF0aW9uYWwiKQ0KZGYNCmBgYA0KDQojVHJhbnNmb3JtIHRvIGxvbmcgZm9ybWF0IGZvciBwbG90aW5nDQpgYGB7cn0NCmRmLmxvbmcgPC0gZGYgJT4lIA0KICBwaXZvdF9sb25nZXIoIWMoUmVnaW9uLCBQcm92aW5jZSksIG5hbWVzX3RvPSJZZWFyIiwgdmFsdWVzX3RvPSJXYWdlIikNCmRmLmxvbmckWWVhciA8LSBhcy5mYWN0b3IoZGYubG9uZyRZZWFyKQ0KYGBgDQoNCmBgYHtyfQ0KZGYubG9uZyRSZWdpb25fZiA9IGZhY3RvcihkZi5sb25nJFJlZ2lvbiwgbGV2ZWxzPWMoJ1N1bWF0cmEnLCdKYXZhJywnQmFsaS1OdXN0cmEnLCdLYWxpbWFudGFuJywgJ1N1bGF3ZXNpJywgJ01hbHVrdS1QYXB1YScpKQ0KYGBgDQoNCmBgYHtyfQ0KZ2dwbG90KGRmLmxvbmcsIGFlcyhZZWFyLCBXYWdlLCBncm91cD1Qcm92aW5jZSkpICsgZ2VvbV9saW5lKHNpemU9MC4zKSArDQogIGZhY2V0X3dyYXAoflJlZ2lvbl9mKSArDQogIHRoZW1lKA0KICAgIGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZT05MCxoanVzdD0wLjUsIHNpemU9NyksDQogICAgYXhpcy50ZXh0Lnk9ZWxlbWVudF90ZXh0KHNpemU9NyksDQogICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICBheGlzLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTgpLA0KICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT04KQ0KICAgICkgKw0KICBsYWJzKHk9Ik1vbnRobHkgcmVhbCB3YWdlICgwMDAgSURSKSIsIHNpemU9MykNCmdnc2F2ZSgid2FnZS5wbG90LnBuZyIpDQpgYGANCg0KDQoNCiNTZWxlY3QgZGF0YSBvbmx5IGZyb20gMjAwOCBvbndhcmRzIGFuZCByZW1vdmUgIlJlZ2lvbiIgY29sdW1uLCBhbmQgcmVtb3ZlIHRoZSBvYnNlcnZhdGlvbiBvZiBJbmRvbmVzaWENCmBgYHtyfQ0KcmVhbC53YWdlIDwtIHJlYWwud2FnZSAlPiUgDQogIHNlbGVjdCgtYygxLDM6NSkpICU+JSANCiAgc3Vic2V0KFByb3ZpbmNlIT0iTmF0aW9uYWwiKQ0KYGBgDQoNCiNUcmFuc2Zvcm0gdG8gbG9uZyBmb3JtYXQgZm9yIHBsb3RpbmcNCmBgYHtyfQ0KcmVhbC53YWdlLmxvbmcgPC0gcmVhbC53YWdlICU+JSANCiAgcGl2b3RfbG9uZ2VyKCFQcm92aW5jZSwgbmFtZXNfdG89IlllYXIiLCB2YWx1ZXNfdG89IldhZ2UiKQ0KYGBgDQoNCmBgYHtyfQ0KcmVhbC53YWdlLmxvbmcgPC0gYXMuZGF0YS5mcmFtZShyZWFsLndhZ2UubG9uZykNCnJlYWwud2FnZS5sb25nJFllYXIgPC0gYXMuRGF0ZShhcy5mYWN0b3IocmVhbC53YWdlLmxvbmckWWVhciksIGZvcm1hdCA9ICIlWSIpDQpgYGANCg0KYGBge3J9DQpyZWFsLndhZ2UubG9uZyRZZWFyIDwtIGFzLmZhY3Rvcihhcy5udW1lcmljKHJlYWwud2FnZS5sb25nJFllYXIpKQ0KYGBgDQoNCg0KYGBge3J9DQpwcmVwYXJlX3RyZW5kX2dyYXBoKHJlYWwud2FnZS5sb25nLCAiWWVhciIsIGMoIldhZ2UiKSkkcGxvdA0KYGBgDQoNCmBgYHtyfQ0KcHJlcGFyZV9xdWFudGlsZV90cmVuZF9ncmFwaChyZWFsLndhZ2UubG9uZywgIlllYXIiLCBjKDAuMDUsIDAuMjUsIDAuNSwgMC43NSwgMC45NSksICJXYWdlIikkcGxvdCArDQogIGdncGxvdDI6OnlsYWIoIlJlYWwgd2FnZSAoMDAwIElEUikiKSArIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSAyMDA4OjIwMjApICsNCiAgdGhlbWVfY2xhc3NpYygpICsgZ3VpZGVzKGNvbG9yPWd1aWRlX2xlZ2VuZCgiUXVhbnRpbGUiKSkgKyB0aGVtZShheGlzLnRleHQueD1lbGVtZW50X3RleHQoYW5nbGU9OTAsIHNpemU9MTApKQ0KI2dnc2F2ZSgid2FnZV9xdWFudGlsZS5wbmciLCB3aWR0aCA9IDksIGhlaWdodCA9IDUpDQpgYGANCg0KYGBge3J9DQpncmFwaCA8LSBwcmVwYXJlX3F1YW50aWxlX3RyZW5kX2dyYXBoKHJlYWwud2FnZS5sb25nW2MoIlllYXIiLCAiV2FnZSIpXSwgIlllYXIiLCBjKDAuMDUsIDAuMjUsIDAuNSwgMC43NSwgMC45NSkpDQpncmFwaCRwbG90DQpgYGANCg0KDQojUGxvdCB3YWdlIG9mIGFsbCBwcm92aW5jZXMNCmBgYHtyfQ0KZ3JhcGggPC0gcmVhbC53YWdlLmxvbmcgJT4lDQpnZ3Bsb3QoYWVzKHggPSBZZWFyLCB5ID0gV2FnZSwgZ3JvdXA9UHJvdmluY2UpKSArDQpnZW9tX2xpbmUoc2l6ZT0wLjUsIGNvbG9yID0gImRhcmsgZ3JheSIpICsNCmxhYnMoeCA9ICJUaW1lIiwNCnkgPSAiQXZlcmFnZSByZWFsIHdhZ2UgcGVyIG1vbnRoICh0aG91c2FuZCBJRFIpIiwgY29sb3I9IiIpICsNCnRoZW1lKHRleHQ9ZWxlbWVudF90ZXh0KCBmYW1pbHk9IlBhbGF0aW5vIikpICsgdGhlbWUocGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwNCnBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAiYmxhY2siKSkgDQogIGd1aWRlcyhjb2wgPSBndWlkZV9sZWdlbmQobnJvdyA9IDgpKQ0KZ3JhcGgNCmdnc2F2ZSgid2FnZV9hbGwucG5nIiwgd2lkdGggPSA5LCBoZWlnaHQgPSA1KQ0KYGBgDQoNCg0KYGBge3J9DQojaW5zdGFsbC5wYWNrYWdlcygiZ2dwbG90RkwiLCByZXBvcz0iaHR0cDovL2Zsci1wcm9qZWN0Lm9yZy9SIikNCmxpYnJhcnkoZ2dwbG90RkwpDQpgYGANCg0KDQpgYGB7cn0NCkcgPC0gZ2dwbG90KHJlYWwud2FnZS5sb25nLCBhZXMoeD1ZZWFyLCB5PVdhZ2UpKSArDQogIGdlb21fZmxxdWFudGlsZXMocHJvYnM9YygwLjI1LCAwLjUwLCAwLjc1KSwgZmlsbD0icmVkIiwgYWxwaGE9MC4yNSwgc2hvdy5sZWdlbmQ9VFJVRSkgKyBsYWJzKHggPSAiVGltZSIsDQp5ID0gIlJlYWwgd2FnZSIsIGNvbG9yPSIiKSArIHRoZW1lX2NsYXNzaWMoKQ0KRw0KZ2dzYXZlKCJxdWFudGlsZS5wbmciKQ0KYGBgDQoNCmBgYHtyfQ0KbGlicmFyeShza2ltcikNCmBgYA0KDQpgYGB7cn0NCmRlc2MgPC0gcmVhbC53YWdlLmxvbmcgJT4lIA0KICBncm91cF9ieShQcm92aW5jZSkgJT4lIA0KICBza2ltKCkgDQpgYGANCg0KYGBge3J9DQpkZXNjIDwtIGRlc2MgJT4lIA0KICBzZWxlY3QoIWMoNDo4KSkNCmBgYA0KDQpgYGB7cn0NCmRlc2MgPC0gZGVzYyAlPiUgDQogZHJvcF9uYSgpICU+JSANCiAgd3JpdGVfZXhjZWxfY3N2MigiZGVzY19zdGF0LmNzdiIpDQpgYGANCg0KDQoNCiNUcmFuc2Zvcm0gdGhlIHdhZ2Ugc2VyaWVzIHRvIGxvZw0KYGBge3J9DQpyZWFsLndhZ2UubG9nIDwtIGxvZyhyZWFsLndhZ2VbLC0xXSkNCnJlYWwud2FnZS5sb2cNCmBgYA0KDQojUmVtb3ZlIHNob3J0LXJ1biBub2lzZSB1c2luZyBIUCBmaWx0ZXINCmBgYHtyfQ0KZi5yZWFsLndhZ2UubG9nIDwtIGFwcGx5KHJlYWwud2FnZS5sb2csIDEsIA0KZnVuY3Rpb24oeCl7bUZpbHRlcjo6aHBmaWx0ZXIoeCwgZnJlcT02LjI1LCB0eXBlPSJsYW1iZGEiKSR0cmVuZH0gKSANCmYucmVhbC53YWdlLmxvZyA8LSBkYXRhLmZyYW1lKFByb3ZpbmNlID0gcmVhbC53YWdlWywxXSwgdChmLnJlYWwud2FnZS5sb2cpLCBzdHJpbmdzQXNGYWN0b3JzPUZBTFNFICkgDQpjb2xuYW1lcyhmLnJlYWwud2FnZS5sb2cpIDwtIGNvbG5hbWVzKHJlYWwud2FnZSkgDQpgYGANCg0KI0luc3BlY3QgdGhlIGZpbHRlcmVkIGRhdGENCmBgYHtyfQ0KaGVhZChmLnJlYWwud2FnZS5sb2cpDQpgYGANCg0KI1J1biB0aGUgbG9nLXQtdGVzdA0KYGBge3J9DQpILnJlYWwgPC0gY29tcHV0ZUgoZi5yZWFsLndhZ2UubG9nWywtMV0sIHF1YW50aXR5ID0gIkgiKQ0Kcm91bmQoZXN0aW1hdGVNb2QoSC5yZWFsLCB0aW1lX3RyaW09MC4zMzMsIEhBQ21ldGhvZCA9ICJGUVNCIiksIDMpDQpgYGANCg0KI2ZpbmQgY29udmVyZ2VuY2UgY2x1YnMNCmBgYHtyfQ0KY2x1YnMucmVhbCA8LSBmaW5kQ2x1YnMoZi5yZWFsLndhZ2UubG9nLCBkYXRhQ29scz0yOjE0LCB1bml0X25hbWVzID0gMSwgcmVmQ29sPTE0LA0KdGltZV90cmltPTAuMzMzLCBjc3Rhcj0wLCBIQUNtZXRob2QgPSAnRlFTQicpDQpgYGANCg0KYGBge3J9DQpzdW1tYXJ5KGNsdWJzLnJlYWwpDQpgYGANCiNXZSBmaW5kIHRocmVlIGNsdWIgY29udmVyZ2VuY2UgZm8gbm9taW5hbCB3YWdlDQoNCg0KI1Nob3cgdGhlIG1lbWJlcnNoaXAgKHByb3ZpbmNlcykgb2YgZWFjaCBjbHViIA0KDQpgYGB7cn0NCnByaW50KGNsdWJzLnJlYWwpDQpgYGANCg0KYGBge3J9DQpwbG90KGNsdWJzLnJlYWwpDQpgYGANCg0KYGBge3J9DQpwbG90KGNsdWJzLnJlYWwsIGNsdWJzPU5VTEwsIGF2Z1RQID0gVFJVRSwgbGVnZW5kPVRSVUUpDQpgYGANCg0KI01lcmdlIGNsdWJzDQpgYGB7cn0NCm1jbHVicy5yZWFsIDwtIG1lcmdlQ2x1YnMoY2x1YnMucmVhbCwgbWVyZ2VNZXRob2Q9J1BTJykNCnN1bW1hcnkobWNsdWJzLnJlYWwpDQpgYGANCg0KYGBge3J9DQptY2x1YnMucmVhbA0KYGBgDQoNCmBgYHtyfQ0KcGxvdChtY2x1YnMucmVhbCkNCmBgYA0KDQpgYGB7cn0NCnBsb3QobWNsdWJzLnJlYWwsIGNsdWJzPU5VTEwsIGF2Z1RQID0gVFJVRSwgbGVnZW5kPVRSVUUpDQpgYGANCg0KI0NvbnZlcnQgY2x1YnMgZnJvbSBsaXN0IG9iamVjdCB0byBkYXRhZnJhbWUNCmBgYHtyfQ0KdGFibGUubWNsdWJzLnJlYWwgPC0gbWFwKG1jbHVicy5yZWFsLCBhcy5kYXRhLnRhYmxlKQ0KZGYubWNsdWJzLnJlYWwgPC0gcmJpbmRsaXN0KHRhYmxlLm1jbHVicy5yZWFsLCBmaWxsID0gVCwgaWRjb2wgPSBUKQ0KZGYubWNsdWJzLnJlYWwNCmBgYA0KDQpgYGB7cn0NCmNvbG5hbWVzKGRmLm1jbHVicy5yZWFsKVtjKDEsNSldIDwtIGMoIkNsdWIiLCJQcm92aW5jZSIpDQpkZi5tY2x1YnMucmVhbA0KYGBgDQoNCmBgYHtyfQ0KcmVhbC53YWdlLmNsdWIgPC0gYXMuZGF0YS5mcmFtZSgNCiAgaW5uZXJfam9pbihmLnJlYWwud2FnZS5sb2csIGRmLm1jbHVicy5yZWFsLCBieT0iUHJvdmluY2UiKSAlPiUgDQogIHNlbGVjdCgtY29udGFpbnMoYygiY2x1YnMiLCJpZCIsIm1vZGVsIikpKQ0KICApIA0KcmVhbC53YWdlLmNsdWINCmBgYA0KDQpgYGB7cn0NCnJlYWwud2FnZS5jbHViJENsdWIgPC0gZ3N1YigiY2x1YiIsICJDbHViICIsIHJlYWwud2FnZS5jbHViJENsdWIpDQpyZWFsLndhZ2UuY2x1Yg0KYGBgDQoNCiNUcmFuc2l0aW9uIHBhdGggb2YgYWxsIGNsdWJzDQpgYGB7cn0NCnJlbGF0aXZlLnJlYWwgPC0gbGlzdCgpDQpmb3IoYSBpbiAyOjE0KSB7DQogIHJlbGF0aXZlLnJlYWxbW2FdXSA8LSBkYXRhLmZyYW1lKHJlYWwud2FnZS5jbHViJFByb3ZpbmNlLCByZWFsLndhZ2UuY2x1YlssYV0vbWVhbihyZWFsLndhZ2UuY2x1YlssYV0pKQ0KY29sbmFtZXMocmVsYXRpdmUucmVhbFtbYV1dKVsxXTwtICJQcm92aW5jZSINCmNvbG5hbWVzKHJlbGF0aXZlLnJlYWxbW2FdXSlbMl08LSANCnBhc3RlKCJyZWwiLGNvbG5hbWVzKHJlYWwud2FnZS5jbHViKVthXSxzZXA9Il8iKQ0KfQ0KDQpmb3IgKHggaW4gMjoxMykgew0KICByZWxhdGl2ZS5yZWFsW1t4KzFdXTwtbGVmdF9qb2luKHJlbGF0aXZlLnJlYWxbW3hdXSxyZWxhdGl2ZS5yZWFsW1t4KzFdXSwgYnk9IlByb3ZpbmNlIikNCn0NCmBgYA0KDQpgYGB7cn0NCnRhYmxlLnJlbGF0aXZlLnJlYWwgPC0gbWFwKHJlbGF0aXZlLnJlYWwsIGFzLmRhdGEudGFibGUpDQpkZi5yZWxhdGl2ZS5yZWFsIDwtIHJiaW5kbGlzdCh0YWJsZS5yZWxhdGl2ZS5yZWFsLCBmaWxsID0gVCwgaWRjb2wgPSBUKSAlPiUgZHJvcF9uYSgpDQpsaWJyYXJ5KHBseXIpDQpkZi5yZWxhdGl2ZS5yZWFsIDwtIGpvaW4oZGYucmVsYXRpdmUucmVhbCxyZWFsLndhZ2UuY2x1YixieT1jKCdQcm92aW5jZScpKSAlPiUgDQogIHNlbGVjdChQcm92aW5jZSxjb250YWlucygicmVsIiksQ2x1YikNCiAgDQpkZi5yZWxhdGl2ZS5yZWFsIDwtIGFzLmRhdGEuZnJhbWUoZGYucmVsYXRpdmUucmVhbCkNCmBgYA0KDQpgYGB7cn0NCmNvbG5hbWVzKGRmLnJlbGF0aXZlLnJlYWwpIDwtIGdzdWIoInJlbF8iLCIiLGNvbG5hbWVzKGRmLnJlbGF0aXZlLnJlYWwpKQ0KZGYucmVsYXRpdmUucmVhbA0KYGBgDQoNCmBgYHtyfQ0KZGYucmVsYXRpdmUucmVhbC5sb25nIDwtIGRmLnJlbGF0aXZlLnJlYWwgJT4lICBwaXZvdF9sb25nZXIoLWMoUHJvdmluY2UsQ2x1YiksIG5hbWVzX3RvID0gIlRpbWUiLCB2YWx1ZXNfdG89IlJlbF9XYWdlIikNCmRmLnJlbGF0aXZlLnJlYWwubG9uZw0KYGBgDQoNCmBgYHtyfQ0KZGYucmVsYXRpdmUucmVhbC5wYXRoIDwtIGFnZ3JlZ2F0ZShSZWxfV2FnZSB+IENsdWIgKyBUaW1lLCBkZi5yZWxhdGl2ZS5yZWFsLmxvbmcsIG1lYW4pICU+JSANCiAgYXJyYW5nZShDbHViKQ0KYGBgDQoNCmBgYHtyfQ0KcGF0aF9hbGwucmVhbCA8LSBkZi5yZWxhdGl2ZS5yZWFsLnBhdGggJT4lIA0KICBnZ3Bsb3QoYWVzKHg9VGltZSx5PVJlbF9XYWdlLCBncm91cD1DbHViLCBjb2w9Q2x1YikpICsgZ2VvbV9saW5lKCkgKw0KbGFicyh4ID0gIlRpbWUiLA0KeSA9ICJSZWxhdGl2ZSB0cmFuc2l0aW9uIHBhdGhzIG9mIGFsbCBjbHVicyIsIGNvbG9yPSIiKSArDQp0aGVtZSh0ZXh0PWVsZW1lbnRfdGV4dCggZmFtaWx5PSJQYWxhdGlubyIpKSArIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCksDQpwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLCBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gImJsYWNrIikpIA0KICBndWlkZXMoY29sID0gZ3VpZGVfbGVnZW5kKG5yb3cgPSA4KSkNCnBhdGhfYWxsLnJlYWwNCmdnc2F2ZSgicGF0aF9hbGwucmVhbC5wbmciLCB3aWR0aCA9IDksIGhlaWdodCA9IDUpDQpgYGANCg0KI1RyYW5zaXRpb24gcGF0aCBvZiBlYWNoIGNsdWINCiNDbHViIDENCmBgYHtyfQ0KY2x1YjEucmVhbCA8LSByZWFsLndhZ2UuY2x1YiAlPiUgDQogIGZpbHRlcihDbHViID09ICJDbHViIDEiKQ0KYGBgDQoNCmBgYHtyfQ0KcmVsYXRpdmUuY2x1YjEucmVhbCA8LSBsaXN0KCkNCmZvcihhIGluIDI6MTQpIHsNCiAgcmVsYXRpdmUuY2x1YjEucmVhbFtbYV1dIDwtIGRhdGEuZnJhbWUoY2x1YjEucmVhbCRQcm92aW5jZSwgY2x1YjEucmVhbFssYV0vbWVhbihjbHViMS5yZWFsWyxhXSkpDQpjb2xuYW1lcyhyZWxhdGl2ZS5jbHViMS5yZWFsW1thXV0pWzFdPC0gIlByb3ZpbmNlIg0KY29sbmFtZXMocmVsYXRpdmUuY2x1YjEucmVhbFtbYV1dKVsyXTwtIA0KcGFzdGUoInJlbCIsY29sbmFtZXMoY2x1YjEucmVhbClbYV0sc2VwPSJfIikNCn0NCg0KZm9yICh4IGluIDI6MTMpIHsNCiAgcmVsYXRpdmUuY2x1YjEucmVhbFtbeCsxXV08LWxlZnRfam9pbihyZWxhdGl2ZS5jbHViMS5yZWFsW1t4XV0scmVsYXRpdmUuY2x1YjEucmVhbFtbeCsxXV0sIGJ5PSJQcm92aW5jZSIpDQp9DQpgYGANCg0KDQpgYGB7cn0NCnRhYmxlLnJlbGF0aXZlLmNsdWIxLnJlYWwgPC0gbWFwKHJlbGF0aXZlLmNsdWIxLnJlYWwsIGFzLmRhdGEudGFibGUpDQpkZi5yZWxhdGl2ZS5jbHViMS5yZWFsIDwtIHJiaW5kbGlzdCh0YWJsZS5yZWxhdGl2ZS5jbHViMS5yZWFsLCBmaWxsID0gVCwgaWRjb2wgPSBUKSAlPiUgZHJvcF9uYSgpDQpsaWJyYXJ5KHBseXIpDQpkZi5yZWxhdGl2ZS5jbHViMS5yZWFsIDwtIGpvaW4oZGYucmVsYXRpdmUuY2x1YjEucmVhbCxjbHViMS5yZWFsLGJ5PWMoJ1Byb3ZpbmNlJykpICU+JSANCiAgc2VsZWN0KFByb3ZpbmNlLGNvbnRhaW5zKCJyZWwiKSxDbHViKQ0KICANCmRmLnJlbGF0aXZlLmNsdWIxLnJlYWwNCmBgYA0KDQpgYGB7cn0NCmNvbG5hbWVzKGRmLnJlbGF0aXZlLmNsdWIxLnJlYWwpIDwtIGdzdWIoInJlbF8iLCIiLGNvbG5hbWVzKGRmLnJlbGF0aXZlLmNsdWIxLnJlYWwpKQ0KZGYucmVsYXRpdmUuY2x1YjEucmVhbA0KYGBgDQoNCmBgYHtyfQ0KZGYucmVsYXRpdmUuY2x1YjEucmVhbC5sb25nIDwtIGRmLnJlbGF0aXZlLmNsdWIxLnJlYWwgJT4lICBwaXZvdF9sb25nZXIoLWMoUHJvdmluY2UsQ2x1YiksIG5hbWVzX3RvID0gIlRpbWUiLCB2YWx1ZXNfdG89IlJlbF9XYWdlIikNCmRmLnJlbGF0aXZlLmNsdWIxLnJlYWwubG9uZw0KYGBgDQoNCmBgYHtyfQ0KZGYucmVsYXRpdmUuY2x1YjEucmVhbC5wYXRoIDwtIGFnZ3JlZ2F0ZShSZWxfV2FnZSB+IFByb3ZpbmNlICsgVGltZSwgZGYucmVsYXRpdmUuY2x1YjEucmVhbC5sb25nLCBtZWFuKSAlPiUgDQogIGFycmFuZ2UoUHJvdmluY2UpDQpgYGANCg0KYGBge3J9DQphIDwtIHBhdGhfY2x1YjEucmVhbCA8LSBkZi5yZWxhdGl2ZS5jbHViMS5yZWFsLnBhdGggJT4lIA0KICBnZ3Bsb3QoYWVzKHg9VGltZSx5PVJlbF9XYWdlLCBncm91cD1Qcm92aW5jZSwgY29sPVByb3ZpbmNlKSkgKyBnZW9tX2xpbmUoKSArDQpsYWJzKHggPSAiVGltZSIsDQp5ID0gIlJlbGF0aXZlIHRyYW5zaXRpb24gcGF0aHMgb2YgcHJvdmluY2VzIGluIENsdWIgMSIsIGNvbG9yPSIiKSArDQp0aGVtZSh0ZXh0PWVsZW1lbnRfdGV4dCggZmFtaWx5PSJQYWxhdGlubyIpKSArIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCksDQpwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLCBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gImJsYWNrIikpIA0KICBndWlkZXMoY29sID0gZ3VpZGVfbGVnZW5kKG5yb3cgPSA4KSkNCnBhdGhfY2x1YjEucmVhbA0KI2dnc2F2ZSgicGF0aF9jbHViMS5yZWFsLnBuZyIsIHdpZHRoID0gOSwgaGVpZ2h0ID0gNSkNCmBgYA0KDQojQ2x1YiAyDQpgYGB7cn0NCmNsdWIyLnJlYWwgPC0gcmVhbC53YWdlLmNsdWIgJT4lIA0KICBmaWx0ZXIoQ2x1YiA9PSAiQ2x1YiAyIikNCmBgYA0KDQpgYGB7cn0NCnJlbGF0aXZlLmNsdWIyLnJlYWwgPC0gbGlzdCgpDQpmb3IoYSBpbiAyOjE0KSB7DQogIHJlbGF0aXZlLmNsdWIyLnJlYWxbW2FdXSA8LSBkYXRhLmZyYW1lKGNsdWIyLnJlYWwkUHJvdmluY2UsIGNsdWIyLnJlYWxbLGFdL21lYW4oY2x1YjIucmVhbFssYV0pKQ0KY29sbmFtZXMocmVsYXRpdmUuY2x1YjIucmVhbFtbYV1dKVsxXTwtICJQcm92aW5jZSINCmNvbG5hbWVzKHJlbGF0aXZlLmNsdWIyLnJlYWxbW2FdXSlbMl08LSANCnBhc3RlKCJyZWwiLGNvbG5hbWVzKGNsdWIyLnJlYWwpW2FdLHNlcD0iXyIpDQp9DQoNCmZvciAoeCBpbiAyOjEzKSB7DQogIHJlbGF0aXZlLmNsdWIyLnJlYWxbW3grMV1dPC1sZWZ0X2pvaW4ocmVsYXRpdmUuY2x1YjIucmVhbFtbeF1dLHJlbGF0aXZlLmNsdWIyLnJlYWxbW3grMV1dLCBieT0iUHJvdmluY2UiKQ0KfQ0KYGBgDQoNCg0KYGBge3J9DQp0YWJsZS5yZWxhdGl2ZS5jbHViMi5yZWFsIDwtIG1hcChyZWxhdGl2ZS5jbHViMi5yZWFsLCBhcy5kYXRhLnRhYmxlKQ0KZGYucmVsYXRpdmUuY2x1YjIucmVhbCA8LSByYmluZGxpc3QodGFibGUucmVsYXRpdmUuY2x1YjIucmVhbCwgZmlsbCA9IFQsIGlkY29sID0gVCkgJT4lIGRyb3BfbmEoKQ0KbGlicmFyeShwbHlyKQ0KZGYucmVsYXRpdmUuY2x1YjIucmVhbCA8LSBqb2luKGRmLnJlbGF0aXZlLmNsdWIyLnJlYWwsY2x1YjIucmVhbCxieT1jKCdQcm92aW5jZScpKSAlPiUgDQogIHNlbGVjdChQcm92aW5jZSxjb250YWlucygicmVsIiksQ2x1YikNCiAgDQpkZi5yZWxhdGl2ZS5jbHViMi5yZWFsDQpgYGANCg0KYGBge3J9DQpjb2xuYW1lcyhkZi5yZWxhdGl2ZS5jbHViMi5yZWFsKSA8LSBnc3ViKCJyZWxfIiwiIixjb2xuYW1lcyhkZi5yZWxhdGl2ZS5jbHViMi5yZWFsKSkNCmRmLnJlbGF0aXZlLmNsdWIyLnJlYWwNCmBgYA0KDQpgYGB7cn0NCmRmLnJlbGF0aXZlLmNsdWIyLnJlYWwubG9uZyA8LSBkZi5yZWxhdGl2ZS5jbHViMi5yZWFsICU+JSAgcGl2b3RfbG9uZ2VyKC1jKFByb3ZpbmNlLENsdWIpLCBuYW1lc190byA9ICJUaW1lIiwgdmFsdWVzX3RvPSJSZWxfV2FnZSIpDQpkZi5yZWxhdGl2ZS5jbHViMi5yZWFsLmxvbmcNCmBgYA0KDQpgYGB7cn0NCmRmLnJlbGF0aXZlLmNsdWIyLnJlYWwucGF0aCA8LSBhZ2dyZWdhdGUoUmVsX1dhZ2UgfiBQcm92aW5jZSArIFRpbWUsIGRmLnJlbGF0aXZlLmNsdWIyLnJlYWwubG9uZywgbWVhbikgJT4lIA0KICBhcnJhbmdlKFByb3ZpbmNlKQ0KYGBgDQoNCmBgYHtyfQ0KYjwtcGF0aF9jbHViMi5yZWFsIDwtIGRmLnJlbGF0aXZlLmNsdWIyLnJlYWwucGF0aCAlPiUgDQogIGdncGxvdChhZXMoeD1UaW1lLHk9UmVsX1dhZ2UsIGdyb3VwPVByb3ZpbmNlLCBjb2w9UHJvdmluY2UpKSArIGdlb21fbGluZSgpICsNCmxhYnMoeCA9ICJUaW1lIiwNCnkgPSAiUmVsYXRpdmUgdHJhbnNpdGlvbiBwYXRocyBvZiBwcm92aW5jZXMgaW4gQ2x1YiAyIiwgY29sb3I9IiIpICsNCnRoZW1lKHRleHQ9ZWxlbWVudF90ZXh0KCBmYW1pbHk9IlBhbGF0aW5vIikpICsgdGhlbWUocGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwNCnBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAiYmxhY2siKSkgDQogIGd1aWRlcyhjb2wgPSBndWlkZV9sZWdlbmQobnJvdyA9IDgpKQ0KcGF0aF9jbHViMi5yZWFsDQpnZ3NhdmUoInBhdGhfY2x1YjIucmVhbC5wbmciLCB3aWR0aCA9IDksIGhlaWdodCA9IDUpDQpgYGANCg0KYGBge3J9DQpsaWJyYXJ5KHBsb3RseSkNCmdncGxvdGx5KGIpDQpgYGANCg0KDQojQ2x1YiAzDQpgYGB7cn0NCmNsdWIzLnJlYWwgPC0gcmVhbC53YWdlLmNsdWIgJT4lIA0KICBmaWx0ZXIoQ2x1YiA9PSAiQ2x1YiAzIikNCmBgYA0KDQpgYGB7cn0NCnJlbGF0aXZlLmNsdWIzLnJlYWwgPC0gbGlzdCgpDQpmb3IoYSBpbiAyOjE0KSB7DQogIHJlbGF0aXZlLmNsdWIzLnJlYWxbW2FdXSA8LSBkYXRhLmZyYW1lKGNsdWIzLnJlYWwkUHJvdmluY2UsIGNsdWIzLnJlYWxbLGFdL21lYW4oY2x1YjMucmVhbFssYV0pKQ0KY29sbmFtZXMocmVsYXRpdmUuY2x1YjMucmVhbFtbYV1dKVsxXTwtICJQcm92aW5jZSINCmNvbG5hbWVzKHJlbGF0aXZlLmNsdWIzLnJlYWxbW2FdXSlbMl08LSANCnBhc3RlKCJyZWwiLGNvbG5hbWVzKGNsdWIzLnJlYWwpW2FdLHNlcD0iXyIpDQp9DQoNCmZvciAoeCBpbiAyOjEzKSB7DQogIHJlbGF0aXZlLmNsdWIzLnJlYWxbW3grMV1dPC1sZWZ0X2pvaW4ocmVsYXRpdmUuY2x1YjMucmVhbFtbeF1dLHJlbGF0aXZlLmNsdWIzLnJlYWxbW3grMV1dLCBieT0iUHJvdmluY2UiKQ0KfQ0KYGBgDQoNCg0KYGBge3J9DQp0YWJsZS5yZWxhdGl2ZS5jbHViMy5yZWFsIDwtIG1hcChyZWxhdGl2ZS5jbHViMy5yZWFsLCBhcy5kYXRhLnRhYmxlKQ0KZGYucmVsYXRpdmUuY2x1YjMucmVhbCA8LSByYmluZGxpc3QodGFibGUucmVsYXRpdmUuY2x1YjMucmVhbCwgZmlsbCA9IFQsIGlkY29sID0gVCkgJT4lIGRyb3BfbmEoKQ0KbGlicmFyeShwbHlyKQ0KZGYucmVsYXRpdmUuY2x1YjMucmVhbCA8LSBqb2luKGRmLnJlbGF0aXZlLmNsdWIzLnJlYWwsY2x1YjMucmVhbCxieT1jKCdQcm92aW5jZScpKSAlPiUgDQogIHNlbGVjdChQcm92aW5jZSxjb250YWlucygicmVsIiksQ2x1YikNCiAgDQpkZi5yZWxhdGl2ZS5jbHViMy5yZWFsDQpgYGANCg0KYGBge3J9DQpjb2xuYW1lcyhkZi5yZWxhdGl2ZS5jbHViMy5yZWFsKSA8LSBnc3ViKCJyZWxfIiwiIixjb2xuYW1lcyhkZi5yZWxhdGl2ZS5jbHViMy5yZWFsKSkNCmRmLnJlbGF0aXZlLmNsdWIzLnJlYWwNCmBgYA0KDQpgYGB7cn0NCmRmLnJlbGF0aXZlLmNsdWIzLnJlYWwubG9uZyA8LSBkZi5yZWxhdGl2ZS5jbHViMy5yZWFsICU+JSAgcGl2b3RfbG9uZ2VyKC1jKFByb3ZpbmNlLENsdWIpLCBuYW1lc190byA9ICJUaW1lIiwgdmFsdWVzX3RvPSJSZWxfV2FnZSIpDQpkZi5yZWxhdGl2ZS5jbHViMy5yZWFsLmxvbmcNCmBgYA0KDQpgYGB7cn0NCmRmLnJlbGF0aXZlLmNsdWIzLnJlYWwucGF0aCA8LSBhZ2dyZWdhdGUoUmVsX1dhZ2UgfiBQcm92aW5jZSArIFRpbWUsIGRmLnJlbGF0aXZlLmNsdWIzLnJlYWwubG9uZywgbWVhbikgJT4lIA0KICBhcnJhbmdlKFByb3ZpbmNlKQ0KYGBgDQoNCmBgYHtyfQ0KYyA8LSBwYXRoX2NsdWIzLnJlYWwgPC0gZGYucmVsYXRpdmUuY2x1YjMucmVhbC5wYXRoICU+JSANCiAgZ2dwbG90KGFlcyh4PVRpbWUseT1SZWxfV2FnZSwgZ3JvdXA9UHJvdmluY2UsIGNvbD1Qcm92aW5jZSkpICsgZ2VvbV9saW5lKCkgKw0KbGFicyh4ID0gIlRpbWUiLA0KeSA9ICJSZWxhdGl2ZSB0cmFuc2l0aW9uIHBhdGhzIG9mIHByb3ZpbmNlcyBpbiBDbHViIDMiLCBjb2xvcj0iIikgKw0KdGhlbWUodGV4dD1lbGVtZW50X3RleHQoIGZhbWlseT0iUGFsYXRpbm8iKSkgKyB0aGVtZShwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLCBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLA0KcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICJibGFjayIpKSANCiAgZ3VpZGVzKGNvbCA9IGd1aWRlX2xlZ2VuZChucm93ID0gOCkpDQpwYXRoX2NsdWIzLnJlYWwNCiNnZ3NhdmUoInBhdGhfY2x1YjMucmVhbC5wbmciLCB3aWR0aCA9IDksIGhlaWdodCA9IDUpDQpgYGANCg0KYGBge3J9DQpnZ3Bsb3RseShjKQ0KYGBgDQoNCg0KIyBMb2dpdCBtb2RlbA0KIyBMb2FkIHRoZSBkYXRhDQpgYGB7cn0NCmxpYnJhcnkocmVhZHhsKQ0KbG9naXQgPC0gcmVhZF9leGNlbCgiV1MgTGFib3VyX25ldy54bHN4IiwgDQogICAgc2hlZXQgPSAibG9naXQiKQ0KbG9naXQNCmBgYA0KDQpgYGB7cn0NCmxvZ2l0JGNsdWJzX3JlYWwgPC0gZmFjdG9yKGxvZ2l0JGNsdWJzX3JlYWwpDQpsb2dpdCRjbHVic19yZWFsMDggPC0gZmFjdG9yKGxvZ2l0JGNsdWJzX3JlYWwwOCkNCmBgYA0KDQpgYGB7cn0NCmxvZ2l0IDwtIGxvZ2l0ICU+JSANCiAgbXV0YXRlKGxuZ3JkcCA9IGxvZyhncmRwKSkNCmBgYA0KDQpgYGB7cn0NCmdsaW1wc2UobG9naXQpDQpgYGANCg0KYGBge3J9DQpteWxvZ2l0IDwtIGdsbShjbHVicyB+IHJlYWxfd2FnZV8yMDA4ICsgZW1wX21hbnUgKyBwbXRiX2dkcnAgICsgdHBhayArIGxuZ3JkcCwgZGF0YSA9IGxvZ2l0LCBmYW1pbHkgPSAiYmlub21pYWwiKQ0Kc3VtbWFyeShteWxvZ2l0KQ0KYGBg